В общем есть два проекта. Один из них чисто для экспериментов над ним, называется очень оригинально 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 ресурсы из другой программы