【问题标题】:How can my code detect at run time if it compiled for x86 or for Any CPU我的代码如何在运行时检测它是为 x86 还是为任何 CPU 编译的
【发布时间】:2011-09-29 02:07:00
【问题描述】:

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

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

   private const string platformDependentPrefix = "";

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

有没有办法让它自动化?

【问题讨论】:

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


    【解决方案1】:

    非常老套但有效:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          例如

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-03-13
            • 2020-07-18
            • 1970-01-01
            • 2019-07-07
            • 1970-01-01
            • 1970-01-01
            • 2010-12-08
            • 1970-01-01
            相关资源
            最近更新 更多