Как установить значок exe с помощью AssemblyBuilder? - PullRequest
2 голосов
/ 14 марта 2010

Учитывая, что я создаю exe-приложение с AssemblyBuilder, как мне установить icon на него?

Я думаю, я должен использовать

System.Reflection.Emit.AssemblyBuilder.DefineUnmanagedResource

Есть ли пример, как это сделать?


http://msdn.microsoft.com/en-us/library/aa380599(VS.85).aspx

Ответы [ 3 ]

2 голосов
/ 18 марта 2010

Вы также можете изменить значок после сохранения EXE-файла, используя API-интерфейсы ресурсов Win32 BeginUpdateResource, UpdateResource и EndUpdateResource. См. Изменение значка сборки WPF из кода (который не является специфичным для WPF).

1 голос
/ 14 марта 2010

Да, вам понадобится DefineUnmanagedResource (). Файл, который вы передаете, должен быть в формате .RES. Это требует средства Windows SDK rc.exe. Чтобы создать его, начните с создания текстового файла с именем test.rc с таким содержанием:

 100 ICON test.ico

Где test.ico - имя файла, содержащего значок. Запустите командную строку Visual Studio и используйте эту команду

 rc test.rc

Это создает файл test.res. Передайте его путь в DefineUnmanagedResource (), ваш окончательный .exe-файл содержит ресурс значка.

Обратите внимание, что это не проверяется на практике, вероятно, на целевом компьютере не будет установлен Windows SDK, и вы не сможете распространять rc.exe. Но вы можете распространять файл .res.

0 голосов
/ 14 марта 2010

Вам нужно настроить ResourceManager, определив IResourceWriter и записать в него, затем прочитать значок в виде байтов и установить его, в соответствии с этой документацией MSDN , я думаю, код Выглядите примерно так: я не делал этого раньше, судя по примеру кода, после сохранения сборки добавьте неуправляемый ресурс и назовите его «app.ico»:

// Defines a standalone managed resource for this assembly.
IResourceWriter myResourceWriter = myAssembly.DefineResource("myResourceIcon",
         "myResourceIcon.ico", "MyAssemblyResource.resources", 
         ResourceAttributes.Public);
myResourceWriter.AddResource("app.ico", "Testing for the added resource");

myAssembly.Save(myAssembly.GetName().Name + ".dll");

// Defines an unmanaged resource file for this assembly.
bool bSuccess = false;
byte[] iconB = null;
using (System.IO.FileStream fStream = new FileStream("icon.ico", FileMode.Open, FileAccess.Read)){
    iconB = new byte[(int)fStream.Length];
    int nRead = fStream.Read(out iconB, 0, iconB.Length);
    if (nRead == iconB.Length) bSuccess = true;
}
if (bSuccess){
    myAssembly.DefineUnmanagedResource(iconB);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...