2009-01-15 61 views
2

我有一个访问32位COM组件的32位管理程序集。当我使用64位标志编译程序集时,当我尝试从中访问32位COM组件时出现错误。.NET中的互操作问题

有没有办法解决这个问题?

+0

问题是该进程加载x64 .NET框架。 32位的COM组件正在被加载到相同的进程(这是64位),这是不可能的。您应该强制它运行32位x86 .NET框架。 – 2009-01-15 23:34:37

回答

0

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

corflags <assemblyname> /32bit- 

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

+0

这会如何解决问题?这不应该是/ 32bit +吗? – 2009-01-15 23:44:06

1

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

2

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

创建“in proc server”的第一步是将包含COM对象的DLL加载到创建过程中。 DLL是32位,不能加载到进程中。

你不幸坚持2个选项

  1. 明确编译EXE的.Net为32位
  2. 写的组件,以便它可以在它自己的进程主持。即使那样我也不确定让32位和64位进程彼此交谈是多么容易。
2

除了已经给出的答案:

在Windows x64时的处理可以开始为32位或64位的过程。 64位进程只能加载64位dll,而32位进程只能加载32位dll。

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

因此,该代码无法再在64位系统上加载32位dll。

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

0

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