Почему не получается добавить ресурс в файл !!!
От: Аноним  
Дата: 02.06.10 22:06
Оценка:
В общем есть два проекта. Один из них чисто для экспериментов над ним, называется очень оригинально TestApplication Его задача, просто выводить в консоль информацию о содержащихся в нём ресурсах. Вод код:
namespace TestApplication
{
    class Program
    {
        static void Main()
        {
            Assembly currentAssembly = Assembly.GetAssembly(typeof(Program));
            string[] resourceList = currentAssembly.GetManifestResourceNames();

            Console.WriteLine("Ресурсов в сборке : {0}", resourceList.Length);

            for (int i = 0; i < resourceList.Length; i++)
            {
                Console.WriteLine("{0}) {1}", i + 1, resourceList[i]);
            }

            Console.ReadLine();
        }
    }
}

Второй проект, добавляет ресурсы в первый. Использует для этого WinAPI функции BeginUpdateResource, UpdateResource и EndUpdateResource. Добавляются растровые изображения(Bitmap). Его код такой:
namespace Using_WinAPI_Resource_Functions
{
    internal class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern IntPtr BeginUpdateResource(string pFileName, [MarshalAs(UnmanagedType.Bool)] bool bDeleteExistingResources);

        [DllImport("KERNEL32.DLL", EntryPoint = "UpdateResourceW", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true,
            CallingConvention = CallingConvention.StdCall)]
        public static extern bool UpdateResource(IntPtr hUpdate, string pType, UInt32 pName, UInt16 wLanguage, byte[] pData, UInt32 cbData);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);

        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern int GetLastError();

        [STAThread]
        private static void Main()
        {
            using (OpenFileDialog openDialog = new OpenFileDialog())
            {
                openDialog.Multiselect = false;
                openDialog.Title = "Выберете PE-файл над которым будут проводиться операции...";
                openDialog.Filter = "Исполняемые файлы (*.exe)|*.exe|Все файлы (*.*)|*.*";
                if (openDialog.ShowDialog() != DialogResult.OK) return;

                string targetFile = openDialog.FileName;
                Assembly targetAssembly = Assembly.LoadFile(targetFile);

                openDialog.Title = "Выберете ресурс...";
                openDialog.Filter = "Растровое изображение (*.bmp)|*.bmp|Все файлы (*.*)|*.*";
                if (openDialog.ShowDialog() != DialogResult.OK) return;

                // Начинаем процесс записи ресурсов
                IntPtr hUpdate = BeginUpdateResource(openDialog.FileName, false);
                if (hUpdate != IntPtr.Zero)
                {
                    using (BinaryReader binary = new BinaryReader(File.OpenRead(openDialog.FileName)))
                    {
                        long fileLength = (uint)(new FileInfo(openDialog.FileName)).Length;
                        byte[] resourceBytes = binary.ReadBytes((int)fileLength);
                        binary.Close();

                        // Записываем ресурс
                        bool bSuccess = UpdateResource(hUpdate, "RT_BITMAP", Convert.ToUInt32("123"), 1049, resourceBytes, (UInt32)fileLength);
                        if (!bSuccess) Console.WriteLine("Ошибка #" + GetLastError());

                        // Заканчиваем запись
                        EndUpdateResource(hUpdate, !bSuccess);
                    }
                }

                string[] resources = targetAssembly.GetManifestResourceNames();
                Console.WriteLine("Ресурсов в целевой сборке : {0}\n", resources.Length);
                for (int i = 0; i < resources.Length; i++)
                {
                    Console.WriteLine("{0}) {1}", i + 1, resources[i]);
                }
            }
            Console.ReadLine();
        }
    }
}

После запуска второго проекта, он систематически "говорит", что всё в порядке, UpdateResource возвращает true, но в TestApplication ресурсов от этого не добавляется.
В связи с этим вопрос, чего я делаю не так Как мне добавить в TestApplication ресурсы из другой программы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.