我需要创建一个模块,允许动态加载不同版本的相同DLL并创建COM对象。
例如,在计算机上可能安装了3个不同的版本1C:Enterprise,其COM-objects存储在此DLL(C ++)中:
C:\Program Files (x86)\1cv8\8.3.4.389\bin\comcntr.dll
C:\Program Files (x86)\1cv8\8.3.3.156\bin\comcntr.dll
C:\Program Files (x86)\1cv8\8.3.3.322\bin\comcntr.dll
它是完全相同的COM对象 - “v83.ComConnector”。
有没有办法在我的应用程序中同时创建3个Com-object?
我尝试使用kernel32.dll中的“Assembly.LoadFrom”和LoadLibrary,但它不起作用。
为什么我需要使用不同的版本? - 经常在1台物理服务器上工作1个以上版本的1C服务器(并且所有版本号都不相同) - 对于使用1C的俄罗斯开发人员而言,这是正常的。我无法将所有应用程序迁移到同一版本。 所以我需要通过COM-object连接到不同的1C服务器。但我不能只使用一个COM对象 - COM对象的版本和服务器必须相同。
答案 0 :(得分:0)
请注意,此答案表明这是可行的,但请在执行此流程之前检查您的业务案例。
为此,您无法在版本之间强制实施二进制兼容性。实施二进制兼容性将确保版本之间的CLSID相同,您将无法同时在同一台计算机上运行多个版本。要使此解决方案可行,您必须确保每个版本都具有唯一的CLSID。
每个组件都必须具有不同的CLSID。此外,在COM +中运行时,每个人都需要拥有自己的不同名称。这很难实现,因为我假设您没有更改接口名称以包含版本信息。但是,可以通过注册表修改来执行此操作。
首先,您需要安装组件的版本1。然后执行注册表修改。
打开注册表。
将与您的组件相关的密钥导出到单个.reg文件中。查看以下位置并导出您找到的所有匹配项。要导出的CLSID键将位于两个不同位置之一,具体取决于操作系统的版本。
HKEY_CLASSES_ROOT\<your component>
HKEY_LOCAL_MACHINE\Software\Classes\<your component>
HKEY_LOCAL_MACHINE\Software\Classes\<your component CLSID>
- or -
HKEY_LOCAL_MACHINE\Software\Classes\Wow6432Node\CLSID\<your component CLSID>
然后在.reg文件中,重命名该旧组件以指示版本信息。重要说明:请勿更改CLSID。此外,指向DLL将在您的计算机上存在的位置的路径。
更新.reg文件后,运行它。
对每个版本重复此过程。
<强>更新强>
我还发现此链接似乎解决了您所指的特定组件。这是俄语,但谷歌翻译在翻译方面做得很好。