2

我正在使用 c# 开发 Windows 客户端应用程序,在我的 VS 2010 解决方案中有两个项目,启动项目和一个使用第三方 COM 互操作 DLL 的类库。我的桌面是 64 位的,所有客户端机器都是 64 位的好。

如果我将启动项目保留为(构建设置)中的任何 cpu 和调用 COM DLL 的第二个项目的 x86,我将收到以下错误:

Could not load file or assembly ... or one of its dependencies. An attempt was made load a program with an incorrect format.

如果我将两个项目都保留为 Any cpu,则会收到以下错误:

Retrieving the COM class factory for component with CLSID .. failed due to the following error:

知道如何在不将解决方案(所有项目)转换为 x86 的情况下解决问题。

4

3 回答 3

3

好吧,我建议你看看DLL surrogates。这个技巧肯定会解决你的问题,但前提是你可以在注册表中更改 DLL inrpoc 服务器的注册信息。如果该类被配置为使用代理,它将在单独的进程中运行。COM 允许从 64 位应用程序使用进程外 32 位 COM 服务器。

您需要更改的所有内容如下所示:

查看注册表中的以下条目:

HKCR\CLSID\{CLSID_CoClass}

看看它是否有 AppID 字段。如果是这样,只需访问此注册表项:

HKLM\Software\Classes\AppID\{APPID}

并添加没有值的 DllSurrogate 字符串键。

如果该类没有关联的 AppID,您可以自己创建它。然后,您可以使用来自 64 位目标 .net 应用程序的 32 位 inproc 库。

于 2012-04-04T20:16:12.637 回答
1

可能最简单的做法就是将您的主要可执行文件设置为 x86。它的应用程序将确定其余程序集如何被 jit。

于 2012-04-04T20:34:22.720 回答
-1

以上都不适合我。但是您可以做的是,当您单击“添加引用”时,通过 COM 选项卡选择相关引用,而不是浏览到 DLL。这使其特定于版本,因此如果您选择 32 位版本,运行时将随之而来。此外,请确保您已为应用程序池选择了相关的 .NET 框架版本,并且您可能希望将“启用 32 位应用程序”设置为 true(高级应用程序池设置)。

于 2014-04-17T13:56:27.207 回答