鉴于我正在使用AssemblyBuilder生成exe应用程序,我该如何设置图标?如何使用AssemblyBuilder设置exe图标?
我想我应该用
System.Reflection.Emit.AssemblyBuilder.DefineUnmanagedResource
是否有一个例子,如何做到这一点?
http://msdn.microsoft.com/en-us/library/aa380599(VS.85).aspx
鉴于我正在使用AssemblyBuilder生成exe应用程序,我该如何设置图标?如何使用AssemblyBuilder设置exe图标?
我想我应该用
System.Reflection.Emit.AssemblyBuilder.DefineUnmanagedResource
是否有一个例子,如何做到这一点?
http://msdn.microsoft.com/en-us/library/aa380599(VS.85).aspx
您需要定义一个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); }
是的,你将需要DefineUnmanagedRes乌尔斯河()。您传递的文件必须是.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文件。
您也可以在使用Win32资源API BeginUpdateResource,UpdateResource和EndUpdateResource保存EXE后更改图标。请参阅Change WPF Assembly Icon from Code(这不是WPF特有的)。
我不知道是否有可能创建一个模板“res”文件,然后交换它中的图标? – zproxy
.res文件格式没有记录。你可以计算出二进制的.ico数据的偏移量,但当替换的.ico文件大小不一样时,你会遇到麻烦。 –
已经发布7年了。现在有资源标题格式的文档:https://msdn.microsoft.com/en-us/library/windows/desktop/ms648027(v=vs.85).aspx它需要将一个图标分解成各个部分,将图标头转换为GROUP_ICON资源,但我设法找到足够的文档将.ico转换为.res文件。 –