我正在尝试在 64 位 COM dll 和 C# 应用程序之间实现免注册 COM 互操作。
在我之前的一个问题的回答中,我得到了帮助,使我能够在 C# 的 64 位 COM dll 上成功调用 HelloWorld 方法。
但是,这只能通过使用 regsrv32.exe 全局注册 COM dll 来实现。
基于这个答案对于一个相关的问题,我认为我需要将 COM dll 的引用上的隔离标志设置为 true。但是,这会导致以下构建错误:
Problem isolating COM reference 'ComLibInteropLib':
No registered classes were detected for this component.
MSDN 社交问题的答案似乎表明如果可以编译 32 位版本的 dll,则可以解决此问题。
但是,我的 COM 互操作库需要链接到“普通”C++ dll,我没有该库的源代码,并且只能以 x64 形式提供。
所以我的问题是:如何在 64 位 COM dll 和 C# 应用程序之间启用独立标志(或以其他方式并行工作)?
我很高兴在我的计算机或其他开发人员计算机上使用 regsvr32.exe,但我们无法在生产计算机上注册任何 COM dll,而最终应用程序必须在生产计算机上运行。
这是您遇到的原始问题的副作用,COM 服务器未正确注册。当你Isolated
选项设置为 true,构建系统会自动为您生成所需的清单条目。但清单的内容需要来自某处,它使用注册表项。由于它们不存在,因此无法生成清单。
您可以自己编写清单,但这需要对清单的外观有足够的了解。由于犯错的几率非常高,咒语也相当晦涩难懂。因此,为了避免这种情况,您只需注册 COM 服务器即可。仅在您的构建计算机上,它不必在客户端计算机上注册,因为它将使用清单。
您提到了 64 位 COM 服务器,这是另一种可能的故障模式。构建系统仍然是 32 位的,因此您很可能会看到错误的键。 HKLM\Software\Wow6432Node 而不是 HKLM\Software。通过构建两种类型的 COM 服务器来解决这个问题。当你自己使用Regsvr32.exe时要小心,有同样的问题,有两个。 c:\windows\syswow64 中的一个应该用于注册 32 位版本的服务器,c:\windows\system32 中的一个用于注册 64 位版本的服务器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)