c# - 在 .NET Core CLI 下构建 Mono.Options(dotnet 构建)

标签 c# .net

我正在尝试使用 Mono.Options.NET Core 下,¹ 使用其命令行工具。

我最初尝试加载它 from NuGet在我的 project.json 文件中使用依赖项声明,但 dotnet restore 提示该包与 dnxcore50 框架不兼容。²

因此,我决定尝试从源代码构建它。我在 Mono.Options 源代码中注意到它有一个 PCL构建选项。考虑到 PCL 可能非常接近 .NET Core,我尝试创建一个 DLL 项目以在启用该设置的情况下构建它:

{
    "version": "0.0.0-d95ccb2ca5",
    "compilationOptions": {
        "emitEntryPoint": false,
        "define": [ "PCL" ],
    },

    "dependencies": {
        "NETStandard.Library": "1.0.0-rc2-23811"
    },

    "compile": [ "*.cs" ],

    "frameworks": {
        "dnxcore50": { }
    }
}

然后我将从上面的链接下载的 Options.cs 的副本放在同一目录中并说 dotnet build,这会出现以下错误:

.../Mono/Options.cs(137,22): error CS0234: The
type or namespace name 'Serialization' does not exist in the namespace
'System.Runtime' (are you missing an assembly reference?)
.../Mono/Options.cs(729,27): error CS0246: The
type or namespace name 'KeyedCollection<,>' could not be found (are you
missing a using directive or an assembly reference?)

...加上其他几个都源于这两个关键错误。

这终于让我想到了我的问题:

  1. 为什么缺少 System.Runtime.Serialization?根据the docs ,它应该是 .NET Core 的一部分。

  2. 我后来为编译器提示的两个 namespace 的父包添加了显式依赖项:

    ...
    "frameworks": {
        "dotnet5.4": {
            "dependencies": {
                "System.ObjectModel": "4.0.*",
                "System.Runtime": "4.1.0-rc2-23811"
            }
        }
    }
    

    dotnet restore 然后成功,大部分构建错误消失,但关于 Serialization 的第一个错误继续发生。 .NET Core 目前还不完整吗?

  3. 除了等待这个类被移植过来之外,是否有解决方法?

  4. 我在初始项目文件中使用了 dnxcore50,因为 dotnet new 就是这样生成它的。根据 the ASP.NET 5 package search engine,对 dotnet5.4 的更改似乎是必要的,但这是否符合 .NET Core 的要求?³


旁白

  1. 为什么?因为现在是 2016 年,而 .NET 仍然 没有内置的命令行选项解析。呃呃。也许微软对 Xamarin 的收购将导致 Mono.Options 被包含在 .NET Core 中。同时……

  2. Mono.Options 4.2.2.1 — 在提出这个问题后发布 — 解决了这个兼容性问题。

  3. ASP.NET 5 包搜索结果暗示 netcore50 也应该适用于我的目的,但后来我收到关于 没有与 osx.10.10 兼容的运行时程序集的投诉-x64.

    这是在安装了 Mono 4.2.1 的 OS X 10.10 机器上发生的。 Mono.Options 确实在其下构建,显然。出现这个问题是因为我正在尝试将我的一些更简单的现有项目切换到这个新的、更轻的运行时。

最佳答案

System.Runtime.Serialization 机制是 purposefully removed from .NET Core . (向下滚动到“二进制序列化”部分。)幸运的是,当您在 PCL 模式下构建 Mono.Options 时,它实际上并不使用该接口(interface),因此修复很简单:移动 使用 System.Runtime.Serialization#else 子句中插入几行,以便在定义 PCL 时看不到它。

尽可能避免使用 RC2。它仍在开发中,我在 GitHub 上看到了几个 Unresolved 问题。

在 RC1 上,您可以使用 http://packagesearch.azurewebsites.net根据 RC1 查找丢失的包及其版本。

最好是针对特定的 .NET 平台标准构建,而不是单个配置文件,例如 RC1 中的 5.4(RC2 中的 1.3)。

至于你的附带问题,

  • 已经有很多开源的命令行解析库,所以微软并不试图强制你使用一个。
  • .NET Core 的设计不同于 .NET Framework 和 Mono。因此,当 Microsoft 拥有所有工具链时,迁移的痛苦仍然存在,但可以轻松解决。等等等等。

关于c# - 在 .NET Core CLI 下构建 Mono.Options(dotnet 构建),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35934692/

相关文章:

c# - 通过 C# 获取应用程序运行的根目录的普遍方法

c# - C# 中的部分类

c# - 反序列化 GUID 数组时出现 JSON.NET 异常

.net - 评估 Sharepoint 与 ASP.NET 作为开发平台

c# - 获取另一个 Exe 的 App.Config

.net - .NET 的 BLOB 分布式存储?

c# - 从字符串(外部文本文件)在当前应用程序中执行C#代码

c# - 图像处理 C#

c# - 文字换行字符

c# - 使用 Microsoft.Bcl.Async 的 .NET 4.0 程序集的 RegAsm 失败