【发布时间】:2011-04-11 16:10:13
【问题描述】:
我有多种具有不同根元素名称和命名空间的 xml 文件(所有扩展名为 .xml)。我想将每种类型与不同的应用程序相关联,并且还可以为每种类型使用不同的文件图标。这可以使用 C# .NET 完成吗?
【问题讨论】:
我有多种具有不同根元素名称和命名空间的 xml 文件(所有扩展名为 .xml)。我想将每种类型与不同的应用程序相关联,并且还可以为每种类型使用不同的文件图标。这可以使用 C# .NET 完成吗?
【问题讨论】:
处理此问题的唯一方法与 Visual Studio 用于处理 .sln 文件的方法类似,即 Visual Studio 版本选择器。此应用程序与.sln 文件相关联并处理提供图标和处理特定.sln 文件的最终进程。假设您已安装 Visual Studio,请查看 HKEY_CLASSES_ROOT\VisualStudio.Launcher.sln 的注册表以了解它是如何完成的。
所以基本上你需要:
.xml 文件.xml文件的进程对于图标,请查看子键 ShellEx\IconHandler。您会看到它指向(在安装了 Visual Studio 2010 的 x64 机器上)HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{9A2B23E4-2A50-48DB-B3C3-F5EA12947CB8},它在InprocServer32 下列出了负责为文件提供图标的 DLL,在本例中为 C:\Program Files (x86)\Common Files\Microsoft Shared\MSEnv\VSFileHandler.dll。您需要实现一个类似的 DLL,该 DLL 共享启动器进程的配置/逻辑,以确定每个文件要显示的图标。
通常的警告: 在托管代码中编写 shell 扩展一直是一个很大的“不可以”,因为 shell 扩展会被加载到任何显示通用文件对话框的进程中。这可能会导致混乱,因为在 .net 4.0 之前,只能将一个版本的 CLR 加载到进程中,因此在执行此操作之前必须非常确定。鉴于 .net 4.0 支持in-process side by side,这对您来说可能不是问题。
【讨论】:
没有。对于 Windows,XML 文件就是 XML 文件。操作系统不会向内部查看与之关联的命名空间;它只是一个 XML 文件。
Windows 将文件类型与其扩展名相关联,因此,所有 XML 文件都是 XML 文件。您可以自己看到:重命名一个完全不包含 XML 的普通 .txt 文件,然后在资源管理器中刷新它的文件夹视图。您会看到图标从文本文件图像变为 XML 文件图像。
【讨论】:
没有自定义扩展或中间程序,您无法做到这一点。
也许一种选择是拥有一个自定义应用程序,该应用程序被分配来处理 XML 文件。当这个程序被生成时,它会计算出文件的“类型”正在使用 XML 标记之一,并相应地生成正确的进程。这不太可能,但是您可以为不同的“类型”提供不同的图标。
【讨论】: