Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
64位COM dll和C#/.Net应用程序之间的无注册互操作_C#_Visual Studio 2012_Com_64 Bit_Com Interop - Fatal编程技术网

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

64位COM dll和C#/.Net应用程序之间的无注册互操作,c#,visual-studio-2012,com,64-bit,com-interop,C#,Visual Studio 2012,Com,64 Bit,Com Interop,我正在尝试让64位COM dll和C#应用程序之间的免注册COM互操作正常工作 ,我获得了帮助,使我能够成功地在C#的64位COM dll上调用HelloWorld方法 但是,这只能通过使用regsrv32.exe全局注册COM dll来实现 对于一个相关的问题,我认为我需要将COM dll引用上的隔离标志设置为true。但是,这会导致以下生成错误: Problem isolating COM reference 'ComLibInteropLib': No registered cl

我正在尝试让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.
似乎表明,如果可以编译32位版本的dll,就可以解决此问题

<> P>但是,我的COM互操作库需要链接到一个“正常”的C++ DLL,对于它我没有源码,只有X64。p> 所以我的问题是:如何在64位COM dll和C#应用程序之间启用隔离标志(或以其他方式并排工作)


我很高兴在我的机器或其他开发人员的机器上使用regsrv32.exe,但我们无法在生产机器上注册任何COM DLL,因为最终应用程序必须在生产机器上运行。

这是您遇到的原始问题的副作用,COM服务器没有正确注册。当您将隔离选项设置为true时,生成系统会自动为您生成所需的清单条目。但是清单的内容需要来自某个地方,它使用注册表项。因为它们不在那里,所以它无法生成清单

您可以自己编写清单,但这需要对清单的外观有足够的了解。由于犯错误的几率很高,咒语是相当模糊的。因此,要避免这种情况,只需注册COM服务器即可。仅在构建机器上,它不必在客户机上注册,因为它将使用清单


您提到了64位COM服务器,这是另一种可能的故障模式。构建系统仍然是32位的,因此您很可能会看到错误的键。HKLM\Software\WOW6432节点,而不是HKLM\Software。通过构建两种风格的COM服务器来解决这个问题。当您自己使用Regsvr32.exe时,请注意不要出现同样的问题,其中有两个问题。c:\windows\syswow64中的一个应用于注册服务器的32位版本,c:\windows\system32中的一个应用于服务器的64位版本。

是的,我很确定问题是您在第三段中提到的。我不能同时生成这两个版本,因为我的COM dll的目标是使用另一个(普通c++)dll,我只有64位二进制。你只需要注册它,它不必是可运行的。如果您想知道清单应该是什么样子,那么只需使用一个简单的COM服务器进行练习。您将看到所需的清单条目,您只需要更新名称和guid。值得注意的是,如果您必须处理这些苛刻的安装限制,那么选择COM与本机代码进行互操作将是一个有损的建议。使用C++/CLI包装器是更好的方法。我们有一个可以工作的C++/CLI包装器,但它由于本地静态而崩溃,请参阅。我们希望使用COM可以避免这个问题。我们在使用C++/Cli时还遇到了其他各种问题,请参见您自己的评论:)