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
.net NET中的互操作问题_.net_Interop - Fatal编程技术网

.net NET中的互操作问题

.net NET中的互操作问题,.net,interop,.net,Interop,我有一个32位托管程序集,可以访问32位COM组件。当我使用64位标志编译程序集时,当我试图从中访问32位COM组件时,会出现一个错误 有办法解决这个问题吗?您可以尝试使用corflags,可能有效,也可能无效,或者将应用程序设置为仅以32位编译 corflags <assemblyname> /32bit- 这将删除对.Net程序集的32位限制。您应该找到并安装此com组件的64位版本。如果它不可用,您必须将.net应用程序作为32位应用程序运行。com组件正在进程中运行。您不能

我有一个32位托管程序集,可以访问32位COM组件。当我使用64位标志编译程序集时,当我试图从中访问32位COM组件时,会出现一个错误


有办法解决这个问题吗?

您可以尝试使用corflags,可能有效,也可能无效,或者将应用程序设置为仅以32位编译

corflags <assemblyname> /32bit-

这将删除对.Net程序集的32位限制。

您应该找到并安装此com组件的64位版本。如果它不可用,您必须将.net应用程序作为32位应用程序运行。com组件正在进程中运行。您不能在同一进程中同时运行32位和64位代码。

当您使用64位标志并在64位操作系统上运行时,程序集将加载到64位进程中。绝大多数COM对象都是在Proc服务器中创建的

创建进程内服务器的第一步是将包含COM对象的DLL加载到创建进程中。DLL为32位,无法加载到进程中

不幸的是,你有两个选择

显式编译32位的.Net EXE 编写组件,以便它可以托管在自己的进程中。即使这样,我也不确定让32位和64位进程相互通信有多容易。
除了已经给出的答案外:

在Windows x64中,进程可以作为32位或64位进程启动。64位进程只能加载64位DLL,32位进程只能加载32位DLL

如果您的平台目标(例如在.Net应用程序的项目属性中指定的)设置为任何CPU,则中间代码将编译为32位或64位代码,具体取决于目标平台,即在x64系统上,将生成64位代码

因此,代码不能再在64位系统上加载32位dll


如果代码加载非托管程序集,则应始终明确指定目标平台。

当进程作为x64加载时,无法加载x86二进制文件/程序集/任何内容。

问题是进程加载x64.NET framework。32位COM组件正在同一进程中加载,这是64位的,这是不可能的。您应该强制它运行32位x86.NET framework。不,您正在删除互操作上的32位限制,它可能有效,也可能无效,但您可以尝试,有时它们没有问题。但是,作为64位进程运行的互操作如何加载32位COM组件?整个过程应该作为一个32位的过程开始。我同意divo的观点,我认为情况正好相反