如何构建引用相同项目的x64和x86项目

3
我有三个项目,ProjectA (exe)ProjectB (exe)ProjectD (class library)
ProjectA 引用了 System.Data.OracleClient.dll 和 ProjectD。ProjectB 只引用了 ProjectD。由于安装了 32 位的 Oracle 客户端版本,因此 ProjectA 必须是一个 32 位应用程序。ProjectB 可以构建为 64 位应用程序。
Project A 构建设置:
平台:Active (x86)
平台目标:x86
Project B 构建设置:
平台:Active (Any CPU)
平台目标:Any CPU
我的问题是 ProjectD(类库)的构建设置应该是什么?当 ProjectA 和 ProjectB 构建时,它们会以不同的方式构建 ProjectD 吗?在项目间通信方面,更深入的 CLR 解释会很好。
ProjectA 和 ProjectB 将在 64 位 Windows Server 2008 上使用。无需安装,只是独立的 exe 文件。

"Oracle客户端DLL是一个32位的DLL。你为什么这样认为?" - Dennis
抱歉,我应该重新表述一下。32位客户端已安装在服务器上(无法更改),因此它使用32位版本。 - David
2个回答

6
只有EXE项目的平台目标设置才是重要的。这是首先加载并确定整个进程位数的程序集。
DLL没有选择,它必须与EXE项目选择的一致。因此,对于DLL项目来说,选择AnyCPU几乎总是正确的选择。
只有在某些情况下才需要使用显式设置。只有当您知道类库依赖于某种本地代码(例如Oracle提供程序)且在错误的位数上运行该本地代码会产生完全难以理解的异常时,才会这样做。通过为DLL选择平台目标,程序将在尝试加载程序集时很早就失败,并显示BadImageFormatException。尽管此异常也不是非常信息丰富的异常。在管理员决定真正的问题出在哪里之前,可能会有一些机会多次尝试重新安装DLL。
因此,基本准则是:为EXE项目选择x86,在所有其他类库项目中选择AnyCPU,向Oracle发送不友好的消息以解决这个问题。

在 DLL 地狱之后,我遇到了这个问题,并不知道它会像以前那样慢慢解决。感谢您定义了“任何 CPU”和显式平台的链接。 - Zeeshanef

2
我的问题是,ProjectD(类库)的构建设置应该是什么?当ProjectA和ProjectB被构建时,是否会以不同的方式构建ProjectD?从项目之间的通信角度深入解释CLR将会很好。
只需为您的库使用“Any CPU”。它将构建一个独特的程序集,可以在32位和64位环境中执行。
从技术上讲,即时编译将在运行时生成32位代码或64位代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接