os的Visual Studio条件编译

时间:2018-04-19 01:23:37

标签: c# asp.net .net cross-platform .net-standard-2.0

我知道有一种方法可以有条件地编译目标框架,例如#if net461 ....#elif .... 但有没有办法有条件地编译特定的操作系统 像目标_os_MAC或target_os_win

如果有人可以引导我阅读文档或教程以了解如何实现它?

第2部分: 另外,有没有办法创建自定义标记,这样每当新目标操作系统或框架发生更改时,我都不必更改每个标记。例如,从net461到net471

2 个答案:

答案 0 :(得分:1)

这是一个古老的问题,但是如果有人现在来这里,会有更好的选择。

您不需要具有其他配置,而是手动选择要使用的配置。

您可以使用System.Runtime.InteropServices.RuntimeInformation。 https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.runtimeinformation?view=netframework-4.8

这里有一本好手册:https://blog.magnusmontin.net/2018/11/05/platform-conditional-compilation-in-net-core/ 来自链接的最少信息: 更改您的.csproj文件

<PropertyGroup> 
 <OutputType>Exe</OutputType> 
 <TargetFramework>netcoreapp2.0</TargetFramework> 
 <IsWindows Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Windows)))' == 'true'">true</IsWindows> 
 <IsLinux Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))' == 'true'">true</IsLinux> 
</PropertyGroup>
<PropertyGroup Condition="'$(IsWindows)'=='true'">
 <DefineConstants>Windows</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(IsLinux)'=='true'">
 <DefineConstants>Linux</DefineConstants>
</PropertyGroup>

这将有条件地定义常量。您以后使用的方式如下:

#if Linux
    Console.WriteLine("Built on Linux!"); 
#elif Windows
    Console.WriteLine("Built in Windows!"); 
#endif

答案 1 :(得分:0)

这个答案假设你在询问自定义的预处理器符号(这就是我解释它的方式 - 如果我错了,请纠正我。

您可以使用自定义构建配置:

首先进入构建配置管理器..

Configuration Manager

接下来,创建一个新的构建配置。您可以从现有配置中复制配置:

Create new configuration

然后,右键单击您的项目并转到“属性”。在构建选项卡下,定义条件编译符号:

Conditional compilation symbol

对Windows执行相同的操作。

然后你可以编写如下的条件步骤:

    class Program
{
    static void Main(string[] args)
    {
#if MACOS
        Console.WriteLine("OSX");
#elif WINDOWS
        Console.WriteLine("Windows");
#endif

        Console.Read();
    }

根据您选择的构建配置,您将获得:

OSX:

OSX

窗:

Windows