Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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 如何处理32位和64位环境之间的互操作?_.net_Com_Interop_Registry_32bit 64bit - Fatal编程技术网

.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到我的计算机上,它的构建到任何CPU(使用.net reflector检查),如果我想在应用程序构建中引用它的64位(现在我得到一个例外)-是否将其注册为64位就够了(使用regasm)-或者我们不注册互操作-只注册COM

  • 如果我有互操作dll-我可以获得为其创建此互操作的原始COM吗(这对于创建另一个互操作非常有用,例如64位环境)

  • 编辑:在@David response之后,我又选择了一个选项,出乎意料地,它起了作用,但现在我不确定这对本次讨论和解决方案意味着什么。有人能帮忙解决这个问题吗

    我所做的: 我遵循了中的说明,现在COM中的对象可以与我的64位应用程序一起使用了!对所有对象(互操作中的数百个对象)手动执行此操作可能很棘手—这是处理互操作的正确方法吗

    问候,, jotbek

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


    互操作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需要此功能,并将其与整个系统响应性进行平衡。