我们正在为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,以便能够在该特定版本上运行我们的应用程序。这可能还是有另一种方式?
我们非常感谢任何有关此事的帮助或提示。
答案 0 :(得分:4)
更改COM类和接口的GUID是一项艰难的要求,它避免了DLL Hell。要调用您正在处理的正常问题:Version Hell。当您尝试使用未安装在计算机上的一大块代码时,您会收到诊断消息而不是随机的不可诊断的故障。您无法可靠地重新注册,这会严重影响您客户的机器。
是的,你可以像Javascript那样做:使用后期绑定。您不使用互操作库。如果使用早于4的版本,在C#中进行操作非常痛苦,您必须使用反射。但是使用VB.NET或使用C#版本4的动态关键字很容易。这个KB article使用旧方法显示C#中的后期绑定。使用 dynamic 关键字,您可以按照自己编写的方式编写代码,而不是使用对象创建语法。任何类型的版本不匹配问题仍会导致异常,但仅在属性或方法调用时才会发生,并且仅在运行时,而不是编译时。