【问题标题】:Visual studio conditional compilation for osos的Visual Studio条件编译
【发布时间】:2018-04-19 01:23:37
【问题描述】:

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

如果有人可以指导我查看文档或教程如何实现它?

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

【问题讨论】:

  • 不,没有:)
  • 谁告诉你可以从代码中更改 .Net 框架版本?
  • @zackraiyan 你完全误解了这个问题。 OP 正在询问预处理器指令。
  • @SimonWhitehead,OP 在哪里提到它?而且我不明白 Conditionally compile for targeted framework 这个词,这甚至可能吗?据我所知,这只能在 IDE 内构建期间完成,对吗?如果我错了,请纠正我
  • @zackraiyan “有条件地编译”可以表示“在编译时”的任何内容。通过您的 IDE 或通过命令行编译器。为此目的存在预处理器指令......它们发生在之前编译。

标签: c# asp.net .net cross-platform .net-standard-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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    对 Windows 执行相同操作。

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

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

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

    OSX:

    窗口:

    【讨论】:

    • 这个想法就在那里。但是,每当我更换机器时,我不需要更改配置吗?我试图让我的应用程序成为跨平台的,因此它需要能够自动检测它是 Windows 或 macos 机器并运行相应的代码。也许这个解决方案的某个地方缺少步骤。
    • 这一切都是在编译时完成的......你可以编写一个构建脚本来选择你的配置(MSBuild /p:Configuration)......或者你可以简单地切换构建配置(它是一个下拉菜单在 Visual Studio 中)在您的开发机器上。
    • 鉴于您现在说的是“跨平台”和“自动检测”——您希望这发生在编译时还是运行时?我现在对您的要求感到困惑。
    • 抱歉造成误会。我对这件事有点困惑,但在与我的团队讨论后,我现在很清楚了。我正在尝试在编译时执行此操作。所以我想这种方法会奏效。非常感谢。
    • 我需要一共创建4个配置吗?即 MACOS 调试/发布、Windows 调试/发布
    猜你喜欢
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2015-07-10
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多