C# 我的代码如何在运行时检测它是否为x86或任何CPU编译

C# 我的代码如何在运行时检测它是否为x86或任何CPU编译,c#,visual-studio-2010,unit-testing,nunit,C#,Visual Studio 2010,Unit Testing,Nunit,我有很多集成测试,从文件中读取预期结果。我的测试通过相对路径访问这些文件。相对路径对于x86和任何CPU都有一个不同的深度级别。例如,当我的测试在x86下运行时,它们需要读取以下文件“../../TestResults/MyTest.csv”,但在任何CPU下它们都需要访问“../TestResults/MyTest.csv” 到目前为止,我在每个测试夹具中都有以下常数: private const string platformDependentPrefix = ""; 如果我为x86

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

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

   private const string platformDependentPrefix = "";
如果我为x86运行测试,我需要在每个测试夹具中手动将“”更改为“../”


有没有一种自动化的方法?

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

非常老套的方式,但可以:

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

您还可以访问该属性。

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


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

您想知道进程是以64位的方式运行,还是编译的目标是什么

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

如果您想要目标平台,我将在System.Reflection命名空间中查看。PortableExecutableTypes out参数将具有不同的值,具体取决于您是针对x86、AnyCPU还是针对分别设置了Required32位标志、no标志和PE32Plus标志的x64

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