如何使用AssemblyBuilder设置exe图标?

时间:2010-03-14 15:07:11

标签: .net winapi icons

鉴于我正在使用AssemblyBuilder生成exe应用程序,如何为其设置图标

我想我应该使用

System.Reflection.Emit.AssemblyBuilder.DefineUnmanagedResource

有一个例子怎么做?


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

3 个答案:

答案 0 :(得分:2)

您还可以在使用Win32资源API BeginUpdateResource,UpdateResource和EndUpdateResource保存EXE后更改图标。请参阅Change WPF Assembly Icon from Code(不是WPF特定的)。

答案 1 :(得分:1)

是的,你需要DefineUnmanagedResource()。您传递的文件必须是.RES文件格式。这需要rc.exe Windows SDK工具。要创建一个,首先要创建一个名为test.rc的文本文件,其中包含以下内容:

 100 ICON test.ico

其中test.ico是包含图标的文件的名称。启动Visual Studio命令提示符并使用此命令

 rc test.rc

创建一个test.res文件。将其路径传递给DefineUnmanagedResource(),最终的.exe包含图标资源。

请注意,这不是验证实际,目标计算机可能不会安装Windows SDK,您无法重新分发rc.exe。但是你可以分发.res文件。

答案 2 :(得分:-1)

您需要通过定义IResourceWriter来设置ResourceManager并写入它,然后根据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);
}