2012-01-18 5 views
16

プロジェクトプロパティでアプリケーションアイコンを設定することができます。これを行うと、exeはデフォルトアイコンの代わりにこのアイコンを表示します。このアイコンは、Win32リソースであり、また、このようにアクセスすることができます。複数のアイコン(Win32リソース)を.NETアプリケーションに追加する

change icon

私は私のプログラムで使用されているファイルタイプのための特別なアイコンを持っていると思います。ファイルタイプアイコンを関連付けるには、レジストリで指定することができます( "DefaultIcon"キーの "MyProg.exe、1")。

だから私はそれをfiletype-associationに使用できるアセンブリにのアイコンを追加する方法は?あなたのプロジェクトの設定に行く場合は、アプリケーションのアイコンを設定する方法が表示されます、それはWPF-アプリケーション(.NET 4.0)である

答えて

15

Windowsは管理対象リソースについて何も知らないため、アンマネージドリソースを実行可能ファイルに追加する必要があります。 parapuraのスクリーンショットでは、ラジオボタンを選択する必要があります。これには、Windows SDK rc.exeツールを.rcファイルで実行することによって作成されたバイナリファイル.resファイルが必要です。 .rcファイルは、次のようなリソース文を含む単純なテキストファイル、次のとおりです。

1 ICON "mainicon.ico" 
2 ICON "alternative1.ico" 
3 ICON "alternative2.ico" 
1 24 "app.manifest" 

メモ帳が最善である使用して、UTF-8エンコードせずにプロジェクトフォルダにこのファイルを保存してください。必要なapp.manifestファイルをProject + Add New Item、Application Manifest Fileで作成します。 Project +既存アイテムの追加を使用して、この.rcファイルをプロジェクトに追加します。それをダブルクリックし、アイコンとマニフェストを確認できることを確認します。一番上のノード「リソースの追加」を右クリックし、「バージョン+新規」をクリックします。 、バージョン情報を編集します.RESに.rcファイルをコンパイルすることができ、それはもはや自動的にAssemblyInfo.csの属性と一致します

こと用心のVisual Studioコマンドプロンプトを使用してファイル:

rc /r something.rc 

プロジェクトプロパティータブで使用できる.resファイルが作成されます。これを行うことは、ビルド前のイベントはお勧めですが、ちょっと難しいです。これが間違っていける方法の数は数多くあり、幸運です。

+0

の問題を解決したことを(明示的に)忘れていました。私は[ResEdit](http://www.resedit.net/)を使ってrc/res-fileを作成しました。それは完全に動作します – 0xDEADBEEF

+0

または、アプリケーションでこのようなリソースを含むネイティブDLLをデプロイするだけで、カスタムツールを実行したりバージョン情報を失う必要はありません。 –

+0

この方法ではファイルのバージョン情報が失われます。たとえば、C++バージョンの.rcファイルを使用して復元すると、タスクマネージャ/アプリケーションのタイトルに問題があります。 (私自身の解決策を参照し、最後にそれを更新してください。)InsertIcons.exeを使用してください!公式のMicrosoftツールを使用しないでください! :-) – TarmoPikaro

0

PSどうもありがとうございました。追加のアイコンを追加するには

enter image description here

...

  • マウスの右ソリューションエクスプローラでプロジェクトのボタンと選択新規アイテム、その後リソースファイル
  • ダブルリソースファイルをクリックしてくださいソリューションエクスプローラでリソースを追加 - >新しいアイコン
+0

私は知っています。私はこれを既にやった。私はこれをコンパイルすると、exeは選択されたアイコンを持っています。いくつかのアイコンを追加する方法は? – 0xDEADBEEF

+0

@ 0xDEADBEEF私の編集 –

+2

が動作しない(Resource1.resxが追加され、ico-fileとclean + buildソリューションがロードされました)。 hm、私のプログラムはWPF/.NET4-Application – 0xDEADBEEF

8

私はちょうど.resファイルを混乱させることなくこれを行うための簡単なツールを作成しました。ポストビルドイベントの一部として使用できる小さなユーティリティで、特定のフォルダ内のすべてのアイコンファイルをアセンブリに追加することができます。私たちはあなたがアイコンを持っていることを前提とした場合には、次のビルド後のイベントを追加することができ、あなたのメインのプロジェクトフォルダの下にフォルダ:

C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons 

さらに説明とダウンロードがどの回答に基づいてhttp://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

+0

すばらしいツール!私たちのニーズに完全に対応。ありがとう! – CMerat

0

で見つけることができます私は見る - それは非常に自明ではないようですが、残念ながらそれほど単純ではありません。

のは、.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)はどんなソリューションでもあなたのために機能します。

0

シマンテックのアンチウイルスが疑わしいものとして私のexeを報告し始めるまで、私はInsertIconsアプローチを成功裏に使用しました。私の推測では、シマンテック社は、post build stepとしてexeを使いこなすというシグネチャの変更を気に入らなかった。私はcsprojファイルに次のコードを使用してコンパイルされ、別の.NETのDLLクラスライブラリと一緒に行った最後に

は:

<PropertyGroup> 
    <Win32Resource>icons.res</Win32Resource> 
</PropertyGroup> 

がインストールツールを構築するC++を持っている必要はありませんが、あなたは必要ですか上記の受け入れられた答えに記述されているように、リソースコンパイラ。

マイicons.rcファイルは次のようになります。

1 ICON "IconA.ico" 
2 ICON "IconB.ico" 
3 ICON "IconC.ico" 

とプリビルドコマンドは次のとおりです。

"C:\Program Files (x86)\Windows Kits\8.1\bin\x86\rc.exe" $(ProjectDir)icons.rc 
関連する問題