.net 如何处理32位和64位环境之间的互操作?
简短的两个问题,在阅读了几个主题/页面后,我找不到清晰的答案.net 如何处理32位和64位环境之间的互操作?,.net,com,interop,registry,32bit-64bit,.net,Com,Interop,Registry,32bit 64bit,简短的两个问题,在阅读了几个主题/页面后,我找不到清晰的答案 如果我复制了一些互操作dll到我的计算机上,它的构建到任何CPU(使用.net reflector检查),如果我想在应用程序构建中引用它的64位(现在我得到一个例外)-是否将其注册为64位就够了(使用regasm)-或者我们不注册互操作-只注册COM 如果我有互操作dll-我可以获得为其创建此互操作的原始COM吗(这对于创建另一个互操作非常有用,例如64位环境) 编辑:在@David response之后,我又选择了一个选项,出乎意料
互操作DLL只是一个.NET程序集,包含对COM对象调用方法的胶水。知道互操作DLL用于哪个COM DLL将不允许您生成具有不同位的工作互操作DLL。
regasm
用于在.NET中创建要从COM应用程序使用的库,当您有一个COM库要在.NET中使用时,则不适用。@David:谢谢,我不知道这一点。虽然使用确实可以解决位问题,但它的预期用途似乎是隔离—防止COM DLL中的任何问题影响主程序。@jotbek-Interop DLL应该是AnyCPU。需要匹配的是COM DLL的位和启动代码所在的任何程序集。AnyCPU程序集将以进程启动的任何位运行(这就是为什么它是“AnyCPU”:。比如说,你当然可以构建一个32位特定的互操作DLL,但这只是额外的工作。要将32位DLL加载到64位进程中,没有任何简单的方法。您必须使用代理进程。另外,RCW是包含在互操作DLL中的对象。我猜COM DLL没有“正确注册”,因为它注册在注册表的32位区域,而不是64位区域。这是正确的,因为它是一个32位DLL。请参阅DllSurrogate
只是让Windows为您创建代理进程的一种方法。对于任何组的COM对象都没有这样做的方法。此注册表项的作用是使系统将每个此类COM DLL放在其自己的进程中,这是一个资源密集型的过程-开发人员有责任决定哪些DLL需要此功能,并将其与整个系统响应性进行平衡。