Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用AssemblyBuilder设置exe图标?_.net_Winapi_Icons - Fatal编程技术网

.net 如何使用AssemblyBuilder设置exe图标?

.net 如何使用AssemblyBuilder设置exe图标?,.net,winapi,icons,.net,Winapi,Icons,鉴于我正在使用AssemblyBuilder生成一个exe应用程序,我如何为其设置一个图标 我想我应该使用 System.Reflection.Emit.AssemblyBuilder.DefineUnmanagedResource 有没有一个例子如何做到这一点 您需要通过定义IResourceWriter并对其进行写入来设置ResourceManager,然后将图标作为字节读入并进行设置,根据中的文档,我猜代码看起来会像这样,因为根据代码示例判断,在保存程序集后,我以前没有这样做过,添加非

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

我想我应该使用

System.Reflection.Emit.AssemblyBuilder.DefineUnmanagedResource
有没有一个例子如何做到这一点



您需要通过定义
IResourceWriter
并对其进行写入来设置ResourceManager,然后将图标作为字节读入并进行设置,根据中的文档,我猜代码看起来会像这样,因为根据代码示例判断,在保存程序集后,我以前没有这样做过,添加非托管资源并将其命名为“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); } //定义此程序集的独立托管资源。 IResourceWriter myResourceWriter=myAssembly.DefineResource(“myResourceIcon”, “myResourceIcon.ico”、“MyAssemblyResource.resources”, 资源属性(公共); myResourceWriter.AddResource(“app.ico”,“测试添加的资源”); 保存(myAssembly.GetName().Name+“.dll”); //为此程序集定义非托管资源文件。 bool bsucces=假; 字节[]iconB=null; 使用(System.IO.FileStream fStream=newfilestream(“icon.ico”,FileMode.Open,FileAccess.Read)){ iconB=新字节[(int)fStream.Length]; int nRead=fStream.Read(读出iconB,0,iconB.Length); 如果(nRead==iconB.Length)bSuccess=true; } 如果(b成功){ myAssembly.DefineUnmanagedResource(iconB); }
是的,您需要DefineUnmanagedResource()。您传递的文件必须为.RES文件格式。这需要rc.exe Windows SDK工具。要创建一个,首先创建一个名为test.rc的文本文件,其中包含以下内容:

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

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


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

您也可以在保存EXE后使用Win32资源API BeginUpdateResource、UpdateResource和EndUpdateResource更改图标。请参阅(这不是特定于WPF的)。

我想知道是否可以创建一个模板“res”文件,然后交换其中的图标?没有记录.res文件格式。您可以计算出二进制.ico数据的偏移量,但当替换的.ico大小不一样时,您会遇到麻烦。发布此数据已有7年了。现在有关于资源头格式的文档:它需要将图标拆分为各个部分,并将图标头转换为组图标资源,但我设法找到了足够的文档将.ico转换为.res文件,区分采用文件路径的版本和采用字节[]的版本非常重要。文件路径版本导入.res格式,但byte[]版本按原样直接转储到可执行文件中(这意味着定义资源目录结构,其中涉及虚拟地址,我甚至不确定是否可能)。