如果代码是为x86或任何CPU编译的,我的代码如何在运行时检测到

我有很多集成测试,可以读取文件的预期结果。 我的测试通过相对路径访问这些文件。 相对路径是x86与任何CPU的不同深度级别。 例如,当我的测试在x86下运行时,他们需要读取以下文件“../../TestResults/MyTest.csv”,但在任何CPU下他们需要访问“../TestResults/MyTest.csv”

到目前为止,我在每个测试夹具中都有以下常量:

private const string platformDependentPrefix = ""; 

如果我运行x86的测试,我需要在每个测试夹具中手动将“”更改为“../”。

有没有办法实现自动化?

非常hacky方式,但工作:

 public static string Platform { get { if (IntPtr.Size == 8) return "x64"; else return "x86"; } } 

您还可以访问CSharpProjectConfigurationProperties3.PlatformTarget属性。

您是否希望进程是以64位还是以编译为目标运行?

如果您想要进程位数,则可以使用Teoman提到的IntPtr.Size方法(如果使用的是.NET 4,则使用Environment.Is64BitProcess)。

如果你想要目标平台,我会在System.Reflection命名空间中查看Module.GetPEKind 。 PortableExecutableKinds out参数将具有不同的值,具体取决于您是分别使用Required32Bit标志,无标志,PE32Plus标志设置x86,AnyCPU或x64。

您可以使用IntPtr.Size检测当前进程运行的“位数”。 您将获得4个字节(32位)或8个字节(64位)。 没有像任何CPU那样运行的东西,但是你可以为该配置提供#defines,允许你在编译时做出决定。

在X86中构建时,可以将条件编译符号(Project-> Properties-> Build)添加到项目中,并使用它来确定路径。

恩。

 #if X86 path = "x86 path"; #endif 

除此之外,您可能还想创建一个基本测试类,使用此路径的所有测试都inheritance自该测试类。 在此基类中,您将使用编译符号。 这样你实际上只需要定义一次路径。