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

时间:2011-07-05 19:21:43

标签: c# visual-studio-2010 unit-testing nunit

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

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

   private const string platformDependentPrefix = "";

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

有没有办法实现自动化?

4 个答案:

答案 0 :(得分:5)

非常hacky方式,但有效:

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

离。

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

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