Могу ли я определить константы на основе идентификатора среды выполнения в .NET Core? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть приложение .NET Core Console. Моя цель здесь состоит в том, чтобы иметь возможность DLLImport условно вызывать функцию и вызывать ее, но только во время выполнения Windows.

Я подумал, что, если бы я мог получить доступ к идентификатору времени выполнения в файле csproj, я мог бы условно определить константу для этого времени выполнения, тогда в моем c # я мог бы окружить DLLImport и вызывать блоки #if / #endif .

Можно ли установить константы компиляции в пределах csproj в зависимости от времени выполнения, для которого создается проект? Это специально для формата проекта в стиле SDK (который начинается с <Project Sdk="Microsoft.NET.Sdk">) и предназначен для .NET Core.

Примечание: этот вопрос близок, но предназначен для проектов в стиле project.json.

С другой стороны, есть ли лучший подход для достижения моей цели?

1 Ответ

0 голосов
/ 04 мая 2018

Если вы создаете и публикуете для разных сред выполнения, передавая различные параметры --runtime (свойство MSBuild RuntimeIdentifier), вы можете использовать это свойство в файле csproj (что позволяет использовать #if BUILT_FOR_WINDOWS в коде C #) :

<PropertyGroup>
  <DefineConstants Condition="'$(RuntimeIdentifier)' == 'win-x64'">$(DefineConstants);BUILT_FOR_WINDOWS</DefineConstants>
</PropertyGroup>

Однако вы также можете протестировать текущую ОС во время выполнения, используя:

using System.Runtime.InteropServices;
…

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
    // call windows function here
}
else
{
    // do something else here
}

Пока функция, помеченная [DllImport(…)], не вызывается в ОС, где не удается найти библиотеку / метод, проблем не должно быть. Обратите внимание, что DllImport() может также проверять различные библиотеки в зависимости от операционной системы, поэтому DllImport("foo") будет проверять наличие foo.dll, foo.dylib, libfoo.so и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...