Как мой код может обнаружить во время выполнения, если он скомпилирован для x86 или для любого процессора - PullRequest
4 голосов
/ 05 июля 2011

У меня много интеграционных тестов, которые читают ожидаемые результаты из файлов. Мои тесты обращаются к этим файлам по относительным путям. Относительные пути - один уровень глубины, различный для x86 против любого ЦПУ. Например, когда мои тесты выполняются под x86, им нужно прочитать следующий файл "../../TestResults/MyTest.csv", но под любым процессором им необходим доступ "../TestResults/MyTest.csv"

Пока у меня есть следующая константа в каждом тестовом приборе:

   private const string platformDependentPrefix = "";

Если я запускаю свои тесты для x86, мне нужно вручную изменить "" на "../" в каждом тестовом приборе.

Есть ли способ автоматизировать это?

Ответы [ 4 ]

5 голосов
/ 05 июля 2011

Очень хакерский способ, но работает:

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

Также вы можете получить доступ к свойству CSharpProjectConfigurationProperties3.PlatformTarget.

4 голосов
/ 05 июля 2011

Хотите ли вы, чтобы процесс выполнялся как 64-битный или на что нацелена компиляция?

Если вам нужна разрядность процесса, вы можете использовать метод IntPtr.Size, упомянутый Teoman (или Environment.Is64BitProcess, если вы используете .NET 4).

Если вам нужна целевая платформа, я бы посмотрел на Module.GetPEKind в пространстве имен System.Reflection. Параметр PortableExecutableKinds out будет иметь разные значения в зависимости от того, нацелен ли вы на x86, AnyCPU или x64 с флагом Required32Bit, без флага, с установленным флагом PE32Plus.

3 голосов
/ 05 июля 2011

Вы можете добавить условный символ компиляции (Project-> Properties-> Build) в ваш проект при сборке в X86 и использовать его для определения вашего пути.

ех.

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

В дополнение к этому вы можете захотеть создать базовый класс тестирования, от которого наследуются все тесты, использующие этот путь. В этом базовом классе вы бы использовали символ компиляции. Таким образом, вам действительно нужно определить свой путь только один раз.

3 голосов
/ 05 июля 2011

Вы можете определить «битность», при которой выполняется текущий процесс, используя IntPtr.Size. Вы получите либо 4 байта (32-битный), либо 8 байтов (64-битный). Не существует такой вещи, как , работающий в качестве любого ЦП, но вы можете иметь #defines для этой конфигурации, которая позволит вам принимать решения во время компиляции.

...