鑑於我正在使用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文件。 –