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

本文关键字:x86 任何 编译 CPU 是否 代码 检测 运行时 我的 | 更新日期: 2023-09-27 18:01:21

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

到目前为止,我在每个测试夹具中都有以下常量:
   private const string platformDependentPrefix = "";

如果我运行x86的测试,我需要手动将"更改为"..

有办法使它自动化吗?

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

这是一个非常粗糙的方法,但有效:

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

也可以访问CSharpProjectConfigurationProperties3.PlatformTarget属性

您想要进程是作为64位运行还是作为编译目标运行?

如果你想要进程位,那么你可以使用IntPtr。Teoman(或Environment)提到的尺寸方法。Is64BitProcess(如果你使用。net 4).

如果你想要目标平台,我会看看模块。系统中的GetPEKind。反射的名称空间。PortableExecutableKinds out参数将具有不同的值,具体取决于您的目标是x86, AnyCPU还是x64,分别具有Required32Bit标志,no标志,PE32Plus标志集。

您可以使用IntPtr.Size检测当前进程运行的'位'。您将获得4字节(32位)或8字节(64位)。没有像任何CPU那样运行这样的东西,但是您可以为该配置使用#定义,使您能够在编译时做出决定。

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

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

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