Dựa trên câu trả lời mà Tôi hiểu - nó có vẻ khá tầm thường, nhưng tiếc là nó không đơn giản như vậy.
Hãy bắt đầu từ file rc - bạn có thể nhanh chóng ghi file như thế này: myown.rc:
1 ICON "..\\Folder1\\icon1.ico"
2 ICON "..\\folder2\\icon2.ico"
1 24 "myown.manifest"
Nhưng câu hỏi tiếp theo - nơi để có được file manifest mà bạn cần cho ứng dụng của bạn.
Có thể trích xuất đang được sử dụng file manifest, sử dụng dòng lệnh như thế này:
mt -inputresource:myOwnNetExe.exe;#1 -out:myown.manifest
Và sau đó bạn có thể sử dụng manifest với thực thi .net bạn.
Nhưng đây không phải là tất cả. Từ bản thân dự án bạn không thể chỉ định đường dẫn tương đối vào tệp .res của bạn, bạn chỉ có thể sử dụng đường dẫn tuyệt đối. Lưu .csproj và chỉnh sửa thủ công bằng notepad - để tạo đường dẫn tương đối. Dự án biên dịch tốt sau đó.
Nhưng vào svn/git - có thể bạn sẽ không đặt tệp .res - chỉ là mã nguồn. Cần biên dịch .rc thành .res.
Làm tốt nhất trong bước dự án/xây dựng trước.
Nhưng dĩ nhiên rc.exe không thể khởi chạy, vì nó là dự án C++ và chúng tôi có dự án C# không quan tâm đến đường dẫn dự án C++.
này có thể được sử dụng walkarounded pre-build bước như thế này:
cd $(ProjectDir)
call "%VS100COMNTOOLS%\vsvars32.bat" >nul
rc /c 1252 /nologo myown.rc
Trong trường hợp bạn cần phải thay đổi VS100COMNTOOLS với visual studio mà bạn đang biên soạn (Tôi đang sử dụng Visual studio 2010).
Và điều này vẫn không phải là tất cả. Nếu bạn muốn thay đổi biểu tượng của ứng dụng của bạn trên bay - trong thời gian chạy - bạn có thể quan tâm trong mã snipet như thế này:
[DllImport("shell32.dll")]
public static extern IntPtr ExtractIcon(IntPtr hInst, string file, int nIconIndex);
[DllImport("user32.dll", SetLastError = true)]
static extern bool DestroyIcon(IntPtr hIcon);
/// <summary>
/// Sets icon from .exe or .dll into form object
/// </summary>
/// <param name="iIconIndex">Icon index to use.</param>
/// <param name="form">Form to assign to given icon</param>
/// <returns>true if ok, false if failed.</returns>
bool SetIcon(object form, int iIconIndex, String dllOrExe = null)
{
if(dllOrExe == null)
dllOrExe = System.Reflection.Assembly.GetExecutingAssembly().Location;
IntPtr hIcon = ExtractIcon(IntPtr.Zero, dllOrExe, iIconIndex);
if(hIcon == IntPtr.Zero)
return false;
Icon icon = (Icon) Icon.FromHandle(hIcon).Clone();
DestroyIcon(hIcon);
form.GetType().GetProperty("Icon").SetValue(form, icon);
return true;
}
đâu trong Form_Load bạn có thể thực hiện cuộc gọi như thế này:
SetIcon(this, N);
Trong đó N = 0 cho biểu tượng đầu tiên, N = 1 - cho giây và cứ tiếp tục như vậy.
18.5.2016 Cập nhật Cách tiếp cận của tôi hoạt động ok - tuy nhiên - sau khi thông tin phiên bản tệp lắp ráp này biến mất. Nó có thể khôi phục lại nó bằng cách sử dụng điển hình C + + .rc tập tin, nhưng tiếc là đối với tôi nó sau đó phá vỡ các thuộc tính lắp ráp bằng cách nào đó - công việc quản lý sẽ hiển thị exe của bạn là "Ứng dụng". Tôi đã cố gắng thu hoạch sâu hơn một chút nếu có thể bằng cách nào đó thay đổi tiêu đề ứng dụng/biểu hiện - nhưng không có kết quả nào. Sau đó tôi đã kết thúc bằng cách sử dụng giải pháp InsertIcons.exe được đề xuất ở đây là tốt.Vì vậy, nếu bạn không quan tâm đến thông tin phiên bản tệp - bạn có thể sử dụng giải pháp của mình, nếu bạn cần phiên bản tệp và trình quản lý tác vụ sẽ hiển thị ứng dụng của bạn một cách chính xác - hãy sử dụng InsertIcons.exe. C# mã snipet (SetIcon) ở đây sẽ làm việc cho bạn trong bất kỳ giải pháp nào.
được giải quyết. nhưng tôi đã sử dụng [ResEdit] (http://www.resedit.net/) để tạo tập tin rc/res. nó hoạt động hoàn hảo – 0xDEADBEEF
Hoặc chỉ triển khai một DLL gốc có chứa các tài nguyên như vậy với ứng dụng, do đó bạn không phải chạy các công cụ tùy chỉnh hoặc mất thông tin phiên bản. –
Cách tiếp cận này sẽ mất thông tin về phiên bản tệp và nếu bạn khôi phục lại thông tin đó (ví dụ: sử dụng tệp .rc kiểu phiên bản .rc) - bạn vẫn gặp sự cố với trình quản lý tác vụ/tiêu đề ứng dụng không chính xác. (Xem giải pháp của riêng tôi và cập nhật cho nó ở cuối.) Vì vậy, sử dụng InsertIcons.exe! Không sử dụng các công cụ chính thức của Microsoft! :-) – TarmoPikaro