带有32位VB6 COM对象的64位C#

带有32位VB6 COM对象的64位C#,c#,com,vb6,interop,C#,Com,Vb6,Interop,我在proc STA VB6 dll中有一个32位。很遗憾,我对此无能为力。我的C#组件从64位中受益匪浅。在我的64位进程中是否有调用/接口此32位dll的方法?什么包装纸之类的 没有直接的方法可以做到这一点 由于无法移植VB6 inproc dll,我建议您编写一个32位的进程服务器,实现相同的接口,并将其委托给VB6代码。然后,您的64位应用程序可以调用进程外服务器,因为COM将负责在进程之间封送类型 这不漂亮,但会有用的 32位COM组件将不得不耗尽进程 在开始创建包装器之前,请检查CO

我在proc STA VB6 dll中有一个32位。很遗憾,我对此无能为力。我的C#组件从64位中受益匪浅。在我的64位进程中是否有调用/接口此32位dll的方法?什么包装纸之类的

没有直接的方法可以做到这一点

由于无法移植VB6 inproc dll,我建议您编写一个32位的进程服务器,实现相同的接口,并将其委托给VB6代码。然后,您的64位应用程序可以调用进程外服务器,因为COM将负责在进程之间封送类型


这不漂亮,但会有用的

32位COM组件将不得不耗尽进程

在开始创建包装器之前,请检查COM+(对象服务)是否将承载它。

本文帮助您:

我已找到此解决方案,请参见:
•将项目类型从进行中转换为进行外
•使用COM+作为主机(这对我来说很有用)
•使用dllhost作为代理主机

您可以在代理中加载(例如)仅32位的DLL,并通过64位进程以以下方式访问它

如果有可用的封送拆收器,这将起作用。通常,对于具有typelib的组件,封送拆收器是可用的,因为它们通常使用标准封送拆收器。如果对象需要自定义prox/stub,那么它将不起作用,因为64位版本将不存在,或者您从一开始就不会遇到这个问题

如何注册第三方32位组件以从64位客户端使用 首先,您需要一个AppID。如果DLL已经有AppID,您应该使用它。您可以通过在CLSID键下检查您感兴趣的CoClass来找到答案

这里使用的示例是
Capicom.HashedData
Capicom.EncryptedData
类。Capicom仅为32位

  • AppID:CAPICOM没有AppID,因此对于AppID,我刚刚使用了EncryptedData类的CLSID

  • CLSID:您需要一个列表,列出您希望能够从64位客户端创建的每个类的CLSID。在本例中,它只是EncryptedData和HashedData

  • 注册:根据示例创建一个包含详细信息的注册表文件,并将其加载到注册表中

  • Windows Registry Editor Version 5.00
    
    
    ;;; Capicom AppID - just using the Capicom.EncryptedData CLSID
    ;;; Use default surrogate = empty string
    [HKEY_CLASSES_ROOT\AppID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}]
    "DllSurrogate"=""
    
    ;;; Capicom.EncryptedData
    [HKEY_CLASSES_ROOT\CLSID\{A440BD76-CFE1-4D46-AB1F-15F238437A3D}]
    AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}"
    
    ;;; Capicom.HashedData - use same AppID for all!!!!!
    [HKEY_CLASSES_ROOT\CLSID\{CE32ABF6-475D-41F6-BF82-D27F03E3D38B}]
    AppID="{A440BD76-CFE1-4D46-AB1F-15F238437A3D}"
    
您应该使用32位版本的Regedit来执行此操作,因为它是一个32位组件。如果要从32位访问64位组件,请使用另一个。(这是因为针对32位兼容层的注册表虚拟化-使用匹配位版本的regedit可以为您解决此问题,方法是确保您编辑了正确的注册表虚拟化版本)

保存到
myComponent dllhost.reg
文件,然后离开

c:\windows\sysWow64\regedit.exe "myComponent-dllhost.reg"
现在,您应该能够从64位脚本/COM主机访问Capicom.HashedData和Capicom.EncryptedData

注意事项:

  • 这仅适用于基本的OLE自动化类型。任何与VBScript或JavaScript中的Windows脚本主机脚本兼容的对象都应该是正常的
  • 您只需将AppID添加到可直接创建的对象。这基本上是那些具有InprocServer32条目的。从工厂生成的对象或仅作为子对象可用的对象不必添加AppID
  • 如果已经存在AppID,则只需添加空字符串
    “DllSurrogate”
    条目。就这样
  • 这将不会影响DLL的正常客户端。只要位匹配,它们将继续像以前一样在进程中加载。它唯一的区别是,可以从不同比特数的客户端在进程外实例化它

我认为在COM+中作为服务器应用程序托管是可行的。当然取决于dll,但好主意。嗨,Richard,我对COM+非常不熟悉。你能详细介绍一下你的答案吗(或者告诉我如何做的参考资料)?谢谢你的帮助。我的COM+技能已经过时了,我已经有几年没有认真使用COM+了。确保您初始化DCOM安全性是必须的,之后请遵循MSDN。是的,有一种方法可以做到这一点,请参阅我的答案以获取详细说明。在进程外执行可能是一种选择,但无法执行的声明似乎是不正确的。@DaveInCaz uz我不是说不能执行,我说没有直接的方法,这是有区别的。无法将32位DLL加载到64位进程中,但您可以将其加载到32位进程中,并将其作为进程外服务器进行访问。尽管我认为com一直都是相当间接的,所以代理进程的附加层在我看来并不是很大的概念差异。dllhost代理似乎是迄今为止最直接的方法。这个问题的另一个答案有更详细的解释。“添加空字符串”dllhost“entry”您的意思是说“DllSurrogate entry”吗?可能是