2013-01-02 74 views
1

简短的2个问题,在阅读几个主题/页面后我找不到明确的答案。如何处理32位和64位环境之间的Interops?

  1. 如果我复制了一些互操作的dll到我的电脑,它的建立到AnyCpu(使用.NET反射检查),如果我要引用到它的应用程序构建64位(现在我得到一个例外) - 注册为64位就够了(有regasm) - 或者我们不注册interops - 只有COM的?

  2. 如果我有互操作DLL - 我可以得到原来的COM为其创建了互操作(这对于创建另一个互操作,例如对于64位环境很有用)?

编辑:@大卫响应后,我检查了多一个选择,意想不到的是工作,但现在我不知道是什么意思了讨论和解决方案。任何人都可以帮助解决这个问题吗?

我做什么: 我跟着从here说明,现在从COM对象不与我的64位应用程序的工作!对所有对象手动执行此操作可能会非常棘手(其中有数百个对象) - 处理Interop的正确方法是什么?

问候, jotbek

+1

当您在.NET中创建一个要从COM应用程序使用的库时,会使用'regasm',而不是在.NET中要使用COM库时使用'regasm'。 – prprcupofcoffee

+0

@大卫:谢谢我不知道。 – jotbek

+1

虽然使用[DllSurrogate](http://msdn.microsoft.com/en-us/library/windows/desktop/ms691260(v = vs.85).aspx)确实解决了Bitness问题,但它的预期用途似乎隔离 - 保持COM DLL中的任何问题不影响主程序。 – prprcupofcoffee

回答

2

COM服务器(DLL)中的本机代码,所以它们不能越过边界位数,即,32位到64位。你的.NET代码需要被编译为x86(至少在启动代码中),以便拥有一个32位进程来加载COM DLL(除非COM DLL本身是64位,在这种情况下你的启动代码需要编译为x64)。

互操作DLL只是一个.NET程序集,其中包含用于调用COM对象方法的粘连。知道interop DLL的用途是什么COM DLL不会让你生成一个不同位数的工作互操作DLL。

+0

所以你说这个标志与.Net反射器检查我的Interop DLL是为AnyCPU构建的是不相关的?这意味着每个in​​terop需要固定为32位/ 64位体系结构 - 因为它是Interop连接的原始COM位的结果? – jotbek

+1

@jotb​​ek - Interop DLLs应该是AnyCPU。需要匹配的是COM DLL的位数以及启动代码所在的组件。AnyCPU程序集将以进程开始的任何位运行(这就是为什么它是“AnyCPU”:)的原因。您当然可以构建一个32位特定的interop DLL,但这只是额外的工作。 – prprcupofcoffee

+0

好的,非常感谢,如果我必须在64位运行主进程,并且我有AnyCPU Interop,它是适用于原始COM(即32位)的适配器,那么我的选项是什么?我也检查了这一点,并且我知道代理过程会起作用,但不幸的是,它有点慢,但RCW - 运行时可调用包装程序怎么样 - 但为此,我需要原始COM DLL,并且从您编写它不会工作那么当我的原始COM是x32时,我将无法为64位构建RCW? – jotbek