で見つけることができます私は見る - それは非常に自明ではないようですが、残念ながらそれほど単純ではありません。
のは、.RCファイルから始めましょう - あなたはすぐにこのようにファイルを書き込むことができます: myown.rc:
1 ICON "..\\Folder1\\icon1.ico"
2 ICON "..\\folder2\\icon2.ico"
1 24 "myown.manifest"
しかし、次の質問 - どこがあなたのアプリケーションのために必要なマニフェストファイルを取得します。
mt -inputresource:myOwnNetExe.exe;#1 -out:myown.manifest
をそして、あなたはあなたの.NETの実行ファイルとそのマニフェストを使用することができます。
それはこのように、コマンドラインを使用して、現在使用されてマニフェストファイルを抽出することが可能です。
しかしこれはすべてではありません。 プロジェクト自体から、.resファイルへの相対パスを指定することはできません。絶対パスのみを使用できます。 .csprojを保存し、メモ帳で手動で編集してパスを相対的に作成します。その後、プロジェクトはうまくコンパイルされます。
しかし、svn/gitには、おそらく.resファイルのみのソースコードは置かれません。 .rcを.resにコンパイルする必要があります。
プロジェクト/ビルド前のステップで行うのが最適です。
もちろん、rc.exeはC++プロジェクトであるため起動できません.C++プロジェクトの気にしないC#プロジェクトもあります。
これは、このようなプレビルドステップを使用してwalkaroundedすることができます:あなたは(私は、Visual Studio 2010を使用しています)コンパイルしていたとVisual StudioにVS100COMNTOOLSを変更する必要が
cd $(ProjectDir)
call "%VS100COMNTOOLS%\vsvars32.bat" >nul
rc /c 1252 /nologo myown.rc
。
これはまだすべてではありません。実行時に - - あなたはその場で、アプリケーションのアイコンを変更したい場合は、コードに興味があるかもしれない。このようsnipet:
SetIcon(this, N);
:のForm_Loadであなたはこのように電話をかけることができます
[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;
}
最初のアイコンでN = 0、秒でN = 1など。
18.5.2016更新私のアプローチは正常です - しかし、このアセンブリファイルのプロパティ - バージョン情報が消えた後に動作します。典型的なC++の.rcファイルを使用して復元することは可能ですが、残念なことにアセンブリ属性を何とか破棄します。タスクマネージャはexeを「アプリケーション」として表示します。マニフェスト/アプリケーションのタイトルを何とか変更することができれば、少し深く収穫しようとしましたが、結果はありません。その後、私はここでも提案されているInsertIcons.exeソリューションを使用して終了しました。
ファイルのバージョン情報に興味がない場合は、私のソリューションを使用できます。ファイルバージョンが必要な場合は、タスクマネージャがアプリケーションを正しく表示する必要があります。InsertIcons.exeを使用します。ここのC#コードスニペット(SetIcon)はどんなソリューションでもあなたのために機能します。
の問題を解決したことを(明示的に)忘れていました。私は[ResEdit](http://www.resedit.net/)を使ってrc/res-fileを作成しました。それは完全に動作します – 0xDEADBEEF
または、アプリケーションでこのようなリソースを含むネイティブDLLをデプロイするだけで、カスタムツールを実行したりバージョン情報を失う必要はありません。 –
この方法ではファイルのバージョン情報が失われます。たとえば、C++バージョンの.rcファイルを使用して復元すると、タスクマネージャ/アプリケーションのタイトルに問題があります。 (私自身の解決策を参照し、最後にそれを更新してください。)InsertIcons.exeを使用してください!公式のMicrosoftツールを使用しないでください! :-) – TarmoPikaro