我正在尝试使用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?)
......加上其他几个都源于这两个关键错误。
这最终让我想到了我的问题:
为什么System.Runtime.Serialization
丢失了?根据{{3}},它应该是.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
生成它的方式。根据{{3}},对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
在下构建。出现这个问题是因为我试图将一些简单的现有项目切换到这个新的,更轻的运行时。
答案 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)。
关于你的问题,
答案 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"