从64位项目引用x86 COM包装器

从64位项目引用x86 COM包装器,x86,com,64-bit,x86-64,32bit-64bit,X86,Com,64 Bit,X86 64,32bit 64bit,我已经为一家供应商提供的x86库创建了一个x86“包装器”。我一直在遵循这些步骤,主要是通过一些链接来调用COM和 我将该项目标记为“注册COM互操作”。我能够使用oleview找到COM接口,并将其标记为“使用代理进程”。所以希望我在这一点上做得很好,因为DllSurrogate注册表设置 现在我似乎无法获得正确的引用来使用x86 COM。假设我可以通过COM直接引用,或者使用tlbimp来创建RCW程序集,我可以从x64项目中使用这些程序集 对于COM引用,我得到错误“ActiveX类型库是

我已经为一家供应商提供的x86库创建了一个x86“包装器”。我一直在遵循这些步骤,主要是通过一些链接来调用COM和

我将该项目标记为“注册COM互操作”。我能够使用oleview找到COM接口,并将其标记为“使用代理进程”。所以希望我在这一点上做得很好,因为DllSurrogate注册表设置

现在我似乎无法获得正确的引用来使用x86 COM。假设我可以通过COM直接引用,或者使用tlbimp来创建RCW程序集,我可以从x64项目中使用这些程序集

对于COM引用,我得到错误“ActiveX类型库是从.NET程序集导出的,不能作为引用添加。”

当我将dll传递给tlbimp时,我得到“错误TI1002:输入文件不是有效的类型库。”

当我将tlb传递给tlbimp时,我得到“错误TI1029:类型库已从CLR程序集导出,无法作为CLR程序集重新导入。”


非常感谢您对我在这里可能缺少的任何帮助。

希望这将有助于其他在此登陆的人。我已经从COM角度正确配置了。从那时起,它真的变成了早期绑定与后期绑定的问题

通过几行简单的代码,后期绑定工作得很好:

var type = Type.GetTypeFromProgID("ProgId");
dynamic o = Activator.CreateInstance(type);
var foo = o.DoSomething();
早期绑定意味着您将需要引用RCW程序集。在某些情况下,当您直接引用COM对象时,VS会自动为您创建这些对象。但是,在这种情况下,如果从.Net程序集创建COM,然后尝试从COM转换回.Net,VS会认为您在做循环操作,并且不允许这样做。如果您在tlb文件而不是dll上运行tlbimp,它将给出类似的错误


在我们的例子中,我们的包装器项目中缺少了一些程序集,这可能导致使用dll调用tlbimp时失败。但是,由于我们的小接口微不足道,我们选择了使用后期动态绑定。

在一般情况下,您不必编程/编码/开发任何东西(只需配置),就可以从64位COM“客户端”使用x86 COM“服务器”。您可以使用代理或COM+组件服务(它下面也是一个系统的代理),它有一个要快速测试的UI:(当然跳过x86组件创建步骤)@SimonMourier感谢您的回复。我希望使用硬引用RCW(早期绑定)。现在,我将尝试这篇文章中描述的后期绑定技术,看看会发生什么。您可以使用早期绑定或后期绑定。我迟到是因为它比较简单。要使用早期绑定,您需要一个可以在x64项目中引用的.tlb。@SimonMourier后期绑定工作得很好,我认为我们将继续使用它。我怀疑我的tlbimp在dll上失败是因为缺少依赖项。延迟绑定是可以的,只要它适合你(如果你有一个巨大的对象模型,这可能会很痛苦)。依赖关系确实会导致很多问题。您可以使用sysinternals中的procmon工具来检测搜索的文件。