3

我有三个项目,ProjectA (exe) , ProjectB (exe)ProjectD (类库)

项目 A 引用 System.Data.OracleClient.dll 和 ProjectD。项目 B 只是引用了 ProjectD。安装了 32 位客户端版本的 oracle,因此 ProjectA 必须是 32 位应用程序。项目 B 可以构建为 64 位应用程序。

项目 A 构建设置:

平台:活动 (x86)

平台目标:x86

项目 B 构建设置:

平台:活动(任何 CPU)

平台目标:任何 CPU

我的问题是 ProjectD(类库)的构建设置应该是什么,当 ProjectA 和 ProjectB 构建时,它是否以不同的方式构建 ProjectD?就项目的沟通而言,对 CLR 进行更深入的解释将非常有用。

ProjectA 和 ProjectB 将在 64 位 Windows Server 2008 上使用。无需安装,只需独立的 exe。

4

2 回答 2

6

只有 EXE 项目的平台目标设置很重要。这是首先加载并确定整个过程的位数的程序集。

DLL 没有选择,它必须与 EXE 项目选择的任何内容兼容。因此,为 DLL 项目选择 AnyCPU 几乎总是正确的选择。

只有少数情况下您会使用显式设置。只有当您知道类库依赖于某种本机代码(例如 Oracle 提供程序)并且尝试以错误的位数运行该本机代码会产生完全难以理解的异常时,您才会这样做。您可以通过选择 DLL 的平台目标来避免该异常并获得(稍微)更好的异常,当程序尝试加载程序集时,它会提前失败并出现 BadImageFormatException。尽管这个例外也不是一个非常有用的例外。在确定真正的问题出在其他地方之前,管理员可能会尝试重新安装 DLL 几次。

所以基本的基本规则:为 EXE 项目选择 x86,为所有其他类库项目选择 AnyCPU,对 Oracle 无所作为使这变得容易的讨厌图。

于 2013-03-19T12:57:11.760 回答
2

我的问题是 ProjectD(类库)的构建设置应该是什么,当 ProjectA 和 ProjectB 构建时,它是否以不同的方式构建 ProjectD?就项目的沟通而言,对 CLR 进行更深入的解释将非常有用。

只需Any CPU用于您的库。它将构建一个独特的程序集,可以在 32 位和 64 位环境中执行。

从技术上讲,即时编译在运行时生成 32 位代码或 64 位代码。

于 2013-03-19T12:39:43.080 回答