如何将文件扩展名与C#中的当前可执行文件相关联

时间:2020-03-05 18:55:14  来源:igfitidea点击:

我想将文件扩展名与C#中的当前可执行文件相关联。
这样,当用户随后在资源管理器中单击文件时,它将以给定文件作为第一个参数运行我的可执行文件。
理想情况下,还将给定文件扩展名的图标设置为我的可执行文件的图标。
谢谢大家

解决方案

回答

文件关联在注册表中的HKEY_CLASSES_ROOT下定义。

这里有一个VB.NET示例,我可以很方便地移植到C#。

回答

似乎没有用于直接管理文件关联的.Net API,但是我们可以使用注册表类来读取和写入所需的键。

我们需要在HKEY_CLASSES_ROOT下创建一个名称设置为文件扩展名的密钥(例如:"。txt")。将此键的默认值设置为文件类型的唯一名称,例如" Acme.TextFile"。然后在HKEY_CLASSES_ROOT下创建另一个名称设置为" Acme.TextFile"的密钥。添加一个名为" DefaultIcon"的子项,并将该项的默认值设置为包含要用于此文件类型的图标的文件。添加另一个名为" shell"的同级。在"外壳"键下,通过资源管理器上下文菜单为每个希望添加的操作添加一个键,将每个键的默认值设置为可执行文件的路径,后跟一个空格和"%1"以表示该路径到所选文件。

例如,这是一个示例注册表文件,用于在.txt文件和EmEditor之间创建关联:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.txt]
@="emeditor.txt"

[HKEY_CLASSES_ROOT\emeditor.txt]
@="Text Document"

[HKEY_CLASSES_ROOT\emeditor.txt\DefaultIcon]
@="%SystemRoot%\SysWow64\imageres.dll,-102"

[HKEY_CLASSES_ROOT\emeditor.txt\shell]

[HKEY_CLASSES_ROOT\emeditor.txt\shell\open]

[HKEY_CLASSES_ROOT\emeditor.txt\shell\open\command]
@="\"C:\Program Files\EmEditor\EMEDITOR.EXE\" \"%1\""

[HKEY_CLASSES_ROOT\emeditor.txt\shell\print]

[HKEY_CLASSES_ROOT\emeditor.txt\shell\print\command]
@="\"C:\Program Files\EmEditor\EMEDITOR.EXE\" /p \"%1\""

回答

另外,如果我们决定采用注册表方式,请记住当前用户关联位于HKEY_CURRENT_USER \ Software \ Classes下。最好将应用程序添加到那里而不是本地计算机类。

如果程序将由受限用户运行,则无论如何我们将无法修改CLASSES_ROOT。

回答

我们可能选择特定的原因来选择不为项目使用安装包,但是安装包是轻松执行应用程序配置任务(例如注册文件扩展名,添加桌面快捷方式等)的好地方。

以下是使用内置的Visual Studio安装工具创建文件扩展名关联的方法:

  • 在我们现有的C#解决方案中,添加一个新项目,然后选择项目类型作为"其他项目类型"->"设置和部署"->"安装项目"(或者尝试安装向导)
  • 配置安装程序(如果需要帮助,可以使用大量现有文档)
  • 在解决方案资源管理器中右键单击安装项目,选择"查看"->"文件类型",然后添加要注册的扩展名以及运行它的程序。

如果用户为应用程序运行卸载,则此方法还有一个额外的好处就是可以自行清理。

回答

如果使用ClickOnce部署,则将为我们全部处理(至少在VS2008 SP1中);简单地:

  • 项目属性
  • 发布
  • 选项
  • 文件关联
  • (添加我们需要的任何内容)

(请注意,它必须是完全信任的,目标是.NET 3.5,并且已设置为脱机使用)

另请参见MSDN:如何:为ClickOnce应用程序创建文件关联