4

我们正在为 Photoshop 编写一个简单的 .NET C# COM 应用程序,它旨在在从 CS2 到 CS5 的所有版本以及介于两者之间的所有版本上运行。同样的应用程序也以 JavaScript 形式存在,它适用于所有上述版本,因为我们避免实现特定于版本的功能。

我们遇到的问题与 COM 接口有关。例如,如果我们的应用程序是使用 Photoshop CSx 中的 Interop.Photoshop DLL 编译的,则它不会在 Photoshop CSy 上运行。这似乎是因为注册表 CLSID 特定于每个版本的 Photoshop,导致我们的应用程序找不到正确的 COM 接口 DLL,如果在安装了与我们编译的不同版本的 Photoshop 的系统上运行(假设两个应用程序是 32 位的)。

如果这确实是问题所在,我们想知道是否可以使用 CSy CLSID 重新注册 Photoshop 版本 CSx 的 COM 接口,忽略版本之间功能可能不同的事实。

更具体的信息如下:

我们的主要 Photoshop.Application CLSID 位于注册表中:HKEY_CLASSES_ROOT\Photoshop.Application\CLSID 此 CLSID 必须与构建我们的应用程序的 CLSID 相匹配。例如,此 ID 在 CS5 和 CS5.1 之间有所不同。

我们今天唯一的解决方案是为特定版本的 Photoshop 构建我们的应用程序的特定版本,而这只有在我们安装了该特定应用程序版本的情况下才有可能。

我们得到的错误代码是 0x80040154,“检索具有 CLSID {116EE066-135E-4F63-8D0E-78F62705FBFC} 的组件的 COM 类工厂失败”。此应用程序是使用 CS5.1 构建的,但在 CS5.04 上运行导致无法找到 COM 接口。此 CLSID 特定于 CS5.1。总之,我们需要重新注册 COM 接口以匹配 CS5.04 的 CLSID,以便能够在该特定版本上运行我们的应用程序。这是可能的还是有其他方法?

非常感谢我们可以就此事获得的任何帮助或提示。

4

1 回答 1

4

更改 COM 类和接口的 GUID 是一项硬性要求,它可以避免 DLL Hell。要调用您现在正在处理的正常问题:版本地狱。当您尝试使用机器上未安装的代码块版本时,您会收到一条诊断消息,而不是随机无法诊断的故障。您无法可靠地重新注册,这可能会严重破坏您客户的机器。

是的,你可以像 Javascript 那样做:使用后期绑定。您不使用互操作库。在C#中如果使用早于4的版本是非常痛苦的,必须使用反射。但使用 VB.NET 或 C# 版本 4 的动态关键字很容易做到。这篇知识库文章展示了使用旧方式在 C# 中的后期绑定。使用dynamic关键字,您可以按照现在的方式编写代码,而不是对象创建语法。任何类型的版本不匹配问题仍然会导致异常,但仅在属性或方法调用时,并且仅在运行时,而不是编译时。

于 2011-05-10T10:54:46.917 回答