.NET中的Interop问题

时间:2009-01-15 23:28:39

标签: .net interop

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

有解决这个问题的方法吗?

5 个答案:

答案 0 :(得分:2)

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

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

你很遗憾地遇到了两个选择

  1. 明确编译32位的.Net EXE
  2. 编写组件,使其可以托管在自己的进程中。即便如此,我也不确定让32位和64位进程相互通信是多么容易。

答案 1 :(得分:2)

除了已经给出的答案:

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以尝试使用corflags(可能/可能不起作用),或者将您的应用设置为仅在32位编译。

corflags <assemblyname> /32bit-

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

答案 4 :(得分:0)

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