Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何构建引用相同项目的x64和x86项目_C#_Compilation_X86 64 - Fatal编程技术网

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

C# 如何构建引用相同项目的x64和x86项目,c#,compilation,x86-64,C#,Compilation,X86 64,我有三个项目,ProjectA(exe),ProjectB(exe)和ProjectD(类库) 项目A引用System.Data.OracleClient.dll和ProjectD。项目B只是引用了项目D。安装了oracle的32位客户端版本,因此ProjectA必须是32位应用程序。项目B可以构建为64位应用程序 项目生成设置: 平台:活动(x86) 平台目标:x86 项目B生成设置: 平台:活动(任何CPU) 平台目标:任何CPU 我的问题是ProjectD(类库)的构建设置应该是什么?当P

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

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

项目生成设置:

平台:活动(x86)

平台目标:x86

项目B生成设置:

平台:活动(任何CPU)

平台目标:任何CPU

我的问题是ProjectD(类库)的构建设置应该是什么?当ProjectA和ProjectB构建时,它构建ProjectD的方式是否不同?从项目沟通的角度对CLR进行更深入的解释会更好

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

我的问题是ProjectD的构建设置应该是什么( 类库)并且当ProjectA和ProjectB生成时,它会生成吗 投射方式不同?对CLR进行更深入的解释会更好 在项目沟通方面

只需为您的库使用
任何CPU
。它将构建一个独特的程序集,可以在32位en 64位环境中执行


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

只有EXE项目的平台目标设置才重要。这是首先加载的程序集,它决定了整个过程的位

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

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


因此,基本原则是:EXE项目选择x86,所有其他类库项目选择AnyCPU,Oracle没有做任何事情来简化此操作。

“Oracle客户端dll是32位dll”你为什么这么认为?对不起,我应该重新表述一下。32位客户端安装在服务器上(无法更改),因此它使用32位版本。在DLL崩溃之后,我遇到了这个问题,不知道它的解决速度会像以前一样快。感谢您定义“任意CPU”和显式平台的链接。