在.NET Core CLI下构建Mono.Options(dotnet build)

时间:2016-03-11 07:37:32

标签: c# .net

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

我最初尝试使用project.json文件中的依赖项声明加载from NuGet,但dotnet restore抱怨该程序包与dnxcore50框架不兼容。 / p> 因此,我决定尝试从源代码构建它。我在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丢失了?根据{{​​3}},它应该是.NET Core的一部分。

  2. 我后来为编译器抱怨的两个命名空间的父包添加了显式依赖项:

    ...
    "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生成它的方式。根据{{​​3}},对dotnet5.4的更改似乎是必要的,但是这种更改是否与.NET Core有关?³

  5. 旁白

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

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

    3. ASP.NET 5软件包搜索结果意味着netcore50也应该适用于我的目的,但后来我收到有关no run-time assembly compatible with osx.10.10-x64的投诉。

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

3 个答案:

答案 0 :(得分:1)

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

如果可能,请避免使用RC2。它仍处于开发阶段,我在GitHub上看到了几个问题。

在RC1上,您可以使用http://packagesearch.azurewebsites.net查找缺少的包及其针对RC1的版本。

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

关于你的问题,

  • 已有许多开源命令行解析库,因此Microsoft不会强制您使用它。
  • .NET Core与.NET Framework和Mono有不同的设计。因此,当Microsoft拥有所有工具链时,迁移的痛苦仍然存在,但可以很容易地解决。等等。

答案 1 :(得分:1)

您是否已更新至最新版本:4.2.2?这是一个PCL程序集,应该支持所有.NET平台,包括.NETCore4.5。

除支持更多平台外,此版本还允许对参数进行基本类型转换。唯一的限制是不支持TypeDesciptor操作,但所有IConvertable操作都是。

这一切都在这个PR中完成:https://github.com/mono/mono/pull/2662

答案 2 :(得分:0)

文档在技术上并不错误。 {Core} 1.0 RC2中仍存在System.Runtime.Serialization命名空间,但由于the removal of binary serialization,命名空间的顶层现在几乎为空。这就是using System.Runtime.Serialization行失败的原因,即使明确依赖System.Runtime

链接文档页面上的所有类型都在.NET Core中的Primitives子命名空间中实现。因此,将以下内容添加到project.json文件中也会使using语句成功:

"System.Runtime.Serialization.Primitives": "4.1.0-beta-23516"