У меня есть несколько изображений, встроенных в мой исполняемый файл в разделе ресурсов. Я выполнил следующие шаги, чтобы создать свой исполняемый файл:
resgen myResource.resx
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
Спасибо,
Викрам