繁体   English   中英

64位COM dll和C#/。Net应用程序之间的免注册互操作

[英]Registration-free Interop between a 64-bit COM dll and a C#/.Net application

我正在尝试在64位COM dll和C#应用程序之间进行免注册COM互操作。

在我的上一个问题的答案中 ,我得到了帮助,可以使我成功地在64位COM dll上为C#调用HelloWorld方法。

但是,这只能通过使用regsrv32.exe在全球范围内注册COM dll来实现。

基于对相关问题的回答,我认为我需要将COM dll的引用上的Isolated标志设置为true。 但是,这导致以下构建错误:

Problem isolating COM reference 'ComLibInteropLib': 
    No registered classes were detected for this component.

MSDN social上一个问题的答案似乎表明,如果可以编译32位版本的dll,则可以解决此问题。

但是,我的COM互操作库需要链接到“普通” C ++ dll,我没有该源,因此只能作为x64使用。

所以我的问题是:如何在64位COM dll和C#应用程序之间启用隔离标志(或以其他方式并排工作)?

我很高兴在我的计算机或其他开发人员的计算机上使用regsrv32.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位版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM