繁体   English   中英

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

[英]Building Mono.Options under .NET Core CLI (dotnet build)

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

我最初尝试在我的project.json文件中使用依赖声明从NuGet加载它,但是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 根据文档 ,它应该是.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生成它的方式。 根据ASP.NET 5软件包搜索引擎 ,对dotnet5.4的更改似乎是必要的,但这是否会改变与.NET Core的关系?³


旁白

  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 确实在此基础上构建。 出现这个问题是因为我试图将一些简单的现有项目切换到这个新的,更轻的运行时。

System.Runtime.Serialization机制是故意从.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拥有所有工具链时,迁移的痛苦仍然存在,但可以很容易地解决。 等等。

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

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

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

文档在技术上并不错误。 System.Runtime.Serialization命名空间在.NET Core 1.0 RC2中仍然存在,但由于删除了二进制序列化 ,命名空间的顶层现在几乎为空。 这就是using System.Runtime.Serialization行失败的原因,即使对System.Runtime有明确的依赖。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM