У меня есть несколько изображений, встроенных в мой исполняемый файл в разделе ресурсов.
Я выполнил следующие шаги, чтобы создать свой исполняемый файл:
- Создан файл .resx для всех изображений (.jpg) в каталоге с использованием некоторой утилиты. Изображения называются image1.jpg, image2.jpg и т. Д.
- создан файл .resources из файла .resx, используя:
resgen myResource.resx
- Встроенный сгенерированный файл .resource с использованием флага / res в виде:
csc file.cs /res:myResource.resources
4 Я получаю доступ к этим изображениям как:
ResourceManager resources = new ResourceManager("myResource", Assembly.GetExecutingAssembly());
Image foo = (System.Drawing.Image)(resources.GetObject("image1"));
Это все работает нормально, как и ожидалось. Теперь я хочу изменить встроенные изображения на несколько новых изображений. Вот что я сейчас делаю:
class foo
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr BeginUpdateResource(string pFileName, bool bDeleteExistingResources);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, string wLanguage, Byte[] lpData, uint cbData);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);
public static void Main(string[] args)
{
IntPtr handle = BeginUpdateResource(args[0], false);
if (handle.ToInt32() == 0)
throw new Exception("File Not Found: " + fileName + " last err: " + Marshal.GetLastWin32Error());
byte[] imgData = File.ReadAllBytes("SetupImage1.jpg");
int fileSize = imgData.Length;
Console.WriteLine("Updaing resources");
if (UpdateResource(handle, "Image", "image1", "image1", imgData, (uint)fileSize))
{
EndUpdateResource(handle, false);
Console.WriteLine("Update successfully");
}
else
{
Console.WriteLine("Failed to update resource. err: {0}", Marshal.GetLastWin32Error());
}
}
}
Приведенный выше код добавляет новый ресурс для указанного изображения (внутри заголовка IMAGE
с некоторым случайным числом, как показано в Resource hacker
), но я хочу изменить существующие данные ресурса для image1
.
Я уверен, что звоню UpdateResource
с некоторыми неверными аргументами.
Может ли кто-нибудь помочь указать на это?
Я использую .NET версию 2
Спасибо,
Викрам