在WPF EXE中嵌入多个图标
我有一个WPF程序集,我想在其中嵌入五个图标,用于与我的应用程序关联的不同文件类型。 如何将这些图标嵌入我的EXE?
@smoore @Groky @ChrisF,谢谢。 不幸的是,这不是我的要求。 我看到我的问题非常模糊0_°。 让我重新解释一下这个问题:
我有一些图标,比如Application.ico
, Document.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。
– 希望你能用这个……
-
创建App.rc:
101 ICON "Application.ico" 102 ICON "Document.ico" 103 ICON "Help.ico"
-
编译:
rc App.rc
- 将App.res添加到您的项目中(将None作为您的构建操作)。
- 建立。
全部完成!
项目属性 – >资源 – >添加资源 – >添加新图标/添加现有文件(取决于您是否已经创建了图标)
我刚刚创建了一个简单的工具来完成这个,而不必乱用.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"))