Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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
使用.Net互操作(使用TlbImp生成)时,我的COM对象拒绝在代理(dllhost)中执行_.net_C++_Com_Managed - Fatal编程技术网

使用.Net互操作(使用TlbImp生成)时,我的COM对象拒绝在代理(dllhost)中执行

使用.Net互操作(使用TlbImp生成)时,我的COM对象拒绝在代理(dllhost)中执行,.net,c++,com,managed,.net,C++,Com,Managed,这很奇怪 我们有一些托管C++(一个程序集),它使用TLBIMP生成的.NETCOM互操作DLL来调用COM对象。当我们注册COM DLL时,我们指定希望它在代理中执行(“DLLSurrogate”注册表项) 我们的COM DLL是64位的,在64位平台上执行 当我们将程序集与32位应用程序(其中包含托管和非托管代码)集成到COM库时,调用将在DllHost中执行。同一应用程序的64位构建导致调用在调用进程中执行 纯非托管客户端应用程序(32位和64位)在64位系统上正确执行,这表明(我希望)我

这很奇怪

我们有一些托管C++(一个程序集),它使用TLBIMP生成的.NETCOM互操作DLL来调用COM对象。当我们注册COM DLL时,我们指定希望它在代理中执行(“DLLSurrogate”注册表项)

我们的COM DLL是64位的,在64位平台上执行

当我们将程序集与32位应用程序(其中包含托管和非托管代码)集成到COM库时,调用将在DllHost中执行。同一应用程序的64位构建导致调用在调用进程中执行

纯非托管客户端应用程序(32位和64位)在64位系统上正确执行,这表明(我希望)我们已经正确配置/安装了COM库

此行为可能表示.NET COM互操作正在忽略注册表中的配置信息。32位客户端无法将64位COM DLL加载到其地址空间中,并且默认使用代理?无论如何,这种行为对我们来说是灾难性的,因为COM库包含一个表示访问某些硬件的单例,并且可能有许多客户端进程

以前有没有人注意到这种行为

谢谢


Mike D

这是一个奇怪的请求,几乎总是相反;试图从64位代码使用32位COM服务器。如果您有一个32位的服务器构建,那么一定要在进程中使用它,这比进程外代理更高效、更容易操作

64位版本的Windows上的注册表是针对32位应用程序虚拟化的。所有32位COM注册都存储在HKLM\Software\WOW6432节点中。使用Regedit.exe验证COM服务器注册是否确实存在


COM服务器的代理/存根DLL也可能有问题。因为您的服务器运行在另一个进程中,所以需要它们。请确保以32位和64位版本构建这些DLL,并使用正确版本的Regsvr32.exe注册它们,谢谢。一切正常。我们已经使用COM服务器很多年了,32位和64位非托管客户端访问64位服务器。这是一个全新的.Net互操作层,给我们带来了痛苦。我们需要用尽进程来实现我们的单例模式。COM对象访问的驱动程序需要64位客户端,因此需要64位COM服务器。