关于Net Core 多平台程序的Framework问题

关于Net Core 多平台程序的Framework问题:
(本文只是推测,欢迎大家指正)
最近在研究NetCore的多平台问题,起因是有一个Winform的项目,由于跨平台的要求,想改为NetCore的MVC6项目,但是同时也想保留原来的Winform项目。
所以,一些DLL必须要做到即可以在Winform中使用,也可以在WebForm中使用,也就是所谓的多平台的问题。
当然,大部分情况下,NetCore可以很从容的进行多平台的编译,但是,也有一些库的话,不是NetCore内置的库,需要进行一些配置才行。
首先从结论开始说吧:

{
  "version": "1.0.0-*",

  "dependencies": {
    "mongocsharpdriver": "2.3.0-rc1",
    "MongoDB.Driver": "2.3.0-rc1"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": "netcoreapp1.0",
      "dependencies": {
        "System.Xml.XmlSerializer": "4.0.11" 
      }
    },
    "net462": {
      "frameworkAssemblies": {
        "System.Xml": "4.0.0.0",
        "System.Xml.XmlSerializer": "4.0.10"
      }
    }
  }
}

由于程序中使用到了XmlSerializer的一些功能,如果不进行配置的话,NetCoreApp的版本也是无法编译的。
理由大致如下:
netcoreapp1.0 实现了NetStardard1.6版本
在NetStardard1.6版本中没有XmlSerializer。(System.Xml.ReaderWriter 和 System.Xml.XDocument是有的。)

        <dependency id="System.Xml.ReaderWriter" version="4.0.11" />
        <dependency id="System.Xml.XDocument" version="4.0.11" />

完整的列表可以查看你的系统中如下文件:
C:\Users\yourname.nuget\packages\NETStandard.Library\1.6.0\NETStandard.Library.nuspec

这里添加XmlSerializer可以直接添加到root下面的dependencies里面,但是如果这样做的话,你会发现net462的地方会出现问题,
net462,应该是Framework 4.6.2的时候,是无法支持XmlSerializer的4.0.11版本的。理由如下:

4.0.11版本支持4.5,但是不支持4.6.
再看一下4.0.10,这个是支持4.6的

但是,如果你将net462,改为452,则必须改为 "System.Xml.XmlSerializer": "4.0.0.0"
我不知道为什么这里4.0.10不可以。

这个时候还必须注意到netcoreapp1.0使用dependencies,而net462使用的是frameworkAssemblies引入程序的。这里的区别还不是非常清楚。
虽然在github上面有对于project.json的详细介绍,前者是用来指定Package的,后者是指定具体AssebleLevel的引用。

当前这个阶段,关于project.json的一些问题还是比较麻烦的,资料其实也在不停修订中,特别是NetFrame和Core之间,存在着兼容性的问题,所以说多平台程序还是有些注意点的。
当然,如果是简单的跨平台,就是Net Core,不存在兼容性问题了,倒是存在一些功能缺失的问题。

另外,如果发现NetCore 1.0.1安装错误,请先删除1.0.0,然后再安装一次。

本文会随时更新新的发现。

2016/09/18:
如果指定了多平台,现在如果在csproj里面引用xProj,则发生无法找到引用的问题。但是如果在csproj里面直接引用DLL的话,则可以正常使用。
2016/09/21:
在当前的Net Core中,不支持在 csproj 导入 xproj 。

你好,目前是不支持从 csproj 引用 xproj 项目的,这项工作会在 core 1.1 版本中做这个事情,1.1版本已经没有 xproj 项目,升级后的visual studio会自动将 xproj 重命名为 csproj,预计在16年年底或者17年初发布。

目前处理你这种情况有两种方式:
1、将你的程序集打包dll发布到Nuget,或者是通过引用本地程序集的方式引用。
2、转换你的 csproj 为 xproj 。

希望能够帮助你。 😃

posted @ 2016-09-14 17:57  灰毛毛  阅读(2404)  评论(3编辑  收藏  举报