[英]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?)
......加上其他几个都源于这两个关键错误。
这终于让我想到了我的问题:
为什么缺少System.Runtime.Serialization
? 根据文档 ,它应该是.NET Core的一部分。
我后来为编译器抱怨的两个命名空间的父包添加了显式依赖项:
... "frameworks": { "dotnet5.4": { "dependencies": { "System.ObjectModel": "4.0.*", "System.Runtime": "4.1.0-rc2-23811" } } }
dotnet restore
然后成功,并且大多数构建错误都消失了,但是关于Serialization
的第一个错误仍在继续。 .NET Core目前还不完整吗?
除了等待这个课程被移植之外,还有其他解决方法吗?
我在初始项目文件中使用了dnxcore50
,因为这是dotnet new
生成它的方式。 根据ASP.NET 5软件包搜索引擎 ,对dotnet5.4
的更改似乎是必要的,但这是否会改变与.NET Core的关系?³
旁白
为什么? 因为它是2016年,.NET 仍然没有内置的命令行选项解析。 GRRRR。 也许微软收购Xamarin将导致Mono.Options
被包含在.NET Core中。 与此同时...
Mono.Options
4.2.2.1 - 在提出此问题后发布 - 解决了此兼容性问题。
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)。
至于你的问题,
你有没有更新到最新版本: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.