【问题标题】:dot net core build platform/os specific code or class filesdot net core 构建平台/操作系统特定代码或类文件
【发布时间】:2017-01-26 04:59:36
【问题描述】:

我想构建一个 .net 核心库,其中包含用于执行 win32 和 osx 调用的平台特定代码,并且在为每个目标操作系统编译库时,我想包含正确的操作系统代码。

我查看了 corefx 和大量文档,经过大量谷歌搜索后,我发现唯一的方法是在运行时执行操作系统检测,但这既低效又乏味。在 corefx 的情况下,他们有一个复杂的构建系统,似乎会自动拉入特定于平台的文件,但它依赖于 msbuild 等等。我错过了什么吗?

如何在文件级别或代码级别有条件地为操作系统定位代码,例如:

#if osx
// come code
#endif

或者,按照 golangs 的方式,将操作系统名称放入文件名中,例如 MyClass.osx.cs 用于 osx 代码,MyClass.cs 用于非平台内容,构建过程将包含正确的文件本身。

我正在使用 Visual Studio 代码和 project.json。

(我想在 Visual Studio 中我可以定义每个平台目标并包含我自己的定义,但我在 osx 上)

提前致谢。

【问题讨论】:

    标签: .net macos visual-studio-code .net-core


    【解决方案1】:

    您可以在 project.json 中定义构建定义

    "buildOptions": {
                    "define": [ "PORTABLE328" ]
                }
    

    例如:

    {
        "frameworks":{
            "netstandard1.6":{
               "dependencies":{
                    "NETStandard.Library":"1.6.0",
                }
            },
            ".NETPortable,Version=v4.0,Profile=Profile328":{
                "buildOptions": {
                    "define": [ "PORTABLE328" ]
                },
                "frameworkAssemblies":{
                    "mscorlib":"",
                    "System":"",
                    "System.Core":"",
                    "System.Net"
                }
            }
        }
    }
    

    现在您可以有条件地针对该目标进行编译:

    #if !PORTABLE328
    using System.Net.Http;
    using System.Threading.Tasks;
    // Potentially other namespaces which aren't compatible with Profile 328
    #endif
    

    Source

    【讨论】:

    • 这正是我想要的。谢谢。当我最初问这个问题时,您链接的文档也不存在。
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多