在WPF EXE中嵌入多个图标

我有一个WPF程序集,我想在其中嵌入五个图标,用于与我的应用程序关联的不同文件类型。 如何将这些图标嵌入我的EXE?

@smoore @Groky @ChrisF,谢谢。 不幸的是,这不是我的要求。 我看到我的问题非常模糊0_°。 让我重新解释一下这个问题:


我有一些图标,比如Application.icoDocument.ico等,作为我的WPF项目中的资源。 我在大多数情况下使用以下方法访问这些图标:

  

这每次都有效。 我知道。


我的问题是如何在Windows资源管理器中使用相同的图标来进行注册表中的文件关联。 我希望能够通过以下路径访问图标:

 C:\Program Files\MyApp\MyApp.exe,1 

就像图标与HKEY_CLASSES_ROOT文件类型相关联一样。

AFAIK,我应该使用资源文件( .rc ),编译并将其与我的EXE合并。 有点像:

 101 RT_ICON Application.ico 102 RT_ICON Document.ico // etc... 

这是WPF中的正确方法吗? 有没有替代方案,特别是因为这种方法似乎导致从AssemblyInfo.cs删除程序集版本。 我仍然准备在资源中编写版本控制信息而不是程序集的信息。

我找到了一个解决方案 ! 它不完美,但它做我想要的! 由于我用了很长的斯堪的纳维亚之夜来寻找解决方案,我觉得我必须在这里分享。

这是我做的:

1)写了一个哑控制台C#app。

 class ResTest { static void Main() { System.Console.WriteLine("Hello World!"); } } 

2)有一个简单的csc restest.cs来测试我的代码是否有效。

3)打开记事本并在我称为App.rc的文件中写下以下App.rc

 101 ICON "Application.ico" 102 ICON "Document.ico" 103 ICON "Help.ico" 

4)Ran rc /v App.rc , 资源编译器 。 一个新文件App.res出现了。

5)Reran csc但这一次:

 csc /win32res:App.res restest.cs 

6) restest.exe现在有ID为101的图标,我可以在Axialis IconWorkshop中找到另外两个图标。


现在,我注意到我的assembly信息(版本,产品名称,等等等等 )已经消失了。 我用Google搜索了VS_VERSION_INFO并介绍了MSDN关于VERSIONINFO结构的文章,它在RC文件中定义了我需要的属性。

我本来希望采用更“自动化”的方法,但我必须尽我所能使用C#Express和Windows Vista SDK。

– 希望你能用这个……

  1. 创建App.rc:

     101 ICON "Application.ico" 102 ICON "Document.ico" 103 ICON "Help.ico" 
  2. 编译:

     rc App.rc 
  3. 将App.res添加到您的项目中(将None作为您的构建操作)。
  4. 建立。

全部完成!

项目属性 – >资源 – >添加资源 – >添加新图标/添加现有文件(取决于您是否已经创建了图标)

我刚刚创建了一个简单的工具来完成这个,而不必乱用.res文件。 (如果您管理自己的.res文件,则不会自动创建清单和版本资源)。 它是一个很小的实用程序,您可以将其用作Post-Build事件的一部分,并允许您将特定文件夹中的所有图标文件添加到程序集中。 如果我们假设您的主项目文件夹下有一个icons文件夹,则可以添加以下post-build事件:

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

有关详细说明和下载,请访问http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/

除了将文件添加到项目资源之外,您还可以将文件添加到项目中,并将其Build Action设置为resource。

然后,您可以使用Source属性从XAML引用文件。 例如,目录“Resources”中的文件Icon.png将使用以下方式加载:

  

并从您将使用的代码加载文件:

 new BitmapImage(new Uri(@"pack://application:,,,/Resources/Icon.png"))