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

时间:2013-03-19 12:29:46

标签: c# compilation x86-64

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

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

项目构建设置:

平台:有效(x86)

平台目标:x86

项目B构建设置:

平台:活动(任何CPU)

平台目标:任何CPU

我的问题是ProjectD(类库)的构建设置应该是什么,当ProjectA和ProjectB构建时,它是否以不同的方式构建ProjectD?在项目的沟通方面,对CLR的更深入解释将是很好的。

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

2 个答案:

答案 0 :(得分:6)

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

DLL无法做出选择,必须与EXE项目选择的任何内容兼容。因此,为DLL项目选择AnyCPU几乎总是正确的选择。

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

所以基本的基本规则:为EXE项目选择x86,为所有其他类库项目选择AnyCPU,这是Oracle的一个令人讨厌的事情,无法做到这一点。

答案 1 :(得分:2)

  

我的问题是ProjectD的构建设置应该是什么(   类库),当ProjectA和ProjectB构建时,它是否构建   ProjectD有何不同?对CLR的更深入解释会很棒   在项目的沟通方面。

只需使用Any CPU作为您的lib。它将构建一个可在32位64位环境中执行的独特程序集。

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