我有一个WPF程序集,我想在其中嵌入五个图标,用于与我的应用程序关联的不同文件类型。 如何将这些图标嵌入我的EXE?
@smoore @Groky @ChrisF,谢谢。 不幸的是,这不是我的要求。我看到我的问题非常模糊0_°。让我重新解释一下这个问题:我在我的WPF项目中有图标,比如Application.ico
,Document.ico
等作为资源。我在大多数情况下通过以下方式访问这些图标:
<Image Source="/MyAssembly;component/Resources/Icons/Application.ico" />
每次都有效。我知道。
我的问题是如何将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
删除了程序集版本。我仍然准备在资源中编写版本控制信息而不是程序集的信息。
答案 0 :(得分:4)
我找到了一个解决方案!它并不完美,但却能满足我的需求!由于我用了很长的斯堪的纳维亚之夜来找到解决方案,我觉得我必须在这里分享。
这就是我的所作所为:
1)写了一个愚蠢的控制台C#app。
class ResTest {
static void Main() {
System.Console.WriteLine("Hello World!");
}
}
2)用一个简单的csc restest.cs
来测试我的代码是否有效。
3)打开记事本并在我称为App.rc
的文件中写下以下内容。
101 ICON "Application.ico"
102 ICON "Document.ico"
103 ICON "Help.ico"
4)跑rc /v App.rc
,Resource Compiler。出现了一个新文件App.res
。
5)Reran csc
但这一次:
csc /win32res:App.res restest.cs
6)restest.exe
现在有一个ID为101的图标,我可以在Axialis IconWorkshop中找到另外两个图标。
现在,我注意到我的装配信息(版本,产品名称,等等等等 blah )已经消失。我用Google搜索了VS_VERSION_INFO
并介绍了MSDN关于VERSIONINFO结构的文章,它在RC文件中定义了我需要的属性。
我希望采用更“自动化”的方法,但我必须尽我所能使用C#Express和Windows Vista SDK。
- 希望你能用这个......
答案 1 :(得分:3)
创建App.rc:
101 ICON "Application.ico"
102 ICON "Document.ico"
103 ICON "Help.ico"
编译:
rc App.rc
全部完成!
答案 2 :(得分:2)
项目属性 - &gt;资源 - &gt;添加资源 - &gt;添加新图标/添加现有文件(取决于您是否已经创建了图标)
答案 3 :(得分:2)
我刚刚创建了一个简单的工具来完成这一操作,而不必弄乱.res文件。 (如果您管理自己的.res文件,则不会自动创建清单和版本资源)。它是一个很小的实用程序,您可以将其用作Post-Build事件的一部分,并允许您将特定文件夹中的所有图标文件添加到程序集中。如果我们假设您在主项目文件夹下有一个icons文件夹,则可以添加以下构建后事件:
C:\path\to\InsertIcons.exe $(TargetPath) $(ProjectDir)icons
可以在http://einaregilsson.com/add-multiple-icons-to-a-dotnet-application/
找到进一步的说明和下载答案 4 :(得分:1)
除了将文件添加到项目资源之外,您还可以将文件添加到项目中,并将其Build Action设置为资源。
然后,您可以使用Source属性从XAML引用文件。例如,目录“Resources”中的文件Icon.png将使用:
加载<Image Source="/Resources/Icon.png"/>
要从您将使用的代码加载文件:
new BitmapImage(new Uri(@"pack://application:,,,/Resources/Icon.png"))