在 DNX 项目中,如何以 Xamarin Android 为目标?

Posted

技术标签:

【中文标题】在 DNX 项目中,如何以 Xamarin Android 为目标?【英文标题】:In a DNX project, how can I target for Xamarin Android? 【发布时间】:2015-12-14 13:21:01 【问题描述】:

TL;DR

我正在编写一个 Xamarin.android 应用程序,并希望引用我的一个库的 NuGet 包,该库是一个以dotnet 为目标的 DNX 类库。当我这样做时,编译器会发出警告

The type 'DateTime' is defined in an assembly that is not referenced. 
You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, ...

IDE 会抱怨类似的消息

Argument type 'System.DateTime [mscorlib, Version=2.0.5.0, Culture ...]' is
not assignable to parameter type 'System.DateTime [mscorlib, Version=4.0.0.0, ...]'

尽管构建成功并且代码有效。如何在库/project.json 中更改它?

说来话长

在工作中,我们目前正在将我们的项目移植到project.json 类型的项目(包、DNX,无论名称如何)。目前,我们正在运行 beta 7 Visual Studio 集成,总的来说,一切正常。 我现在想在 ASP.NET 5 和 Xamarin.Android 项目(来自 NuGet 源)中重用我们的模型库之一。

由于我们在 Xamarin 项目中针对 .NET 4.5.1 的类库完全没有运气,我将模型库迁移到针对 net45dnx45dotnet 的 DNX 项目(支持 dnxcore50 ,如here 所述),project.json 中的框架部分是

"frameworks": 
  "net45": 
    "frameworkAssemblies": 
      "mscorlib": "4.0.0.0",
      "System.Xml": "4.0.0.0",
      "System.Collections.Concurrent": "4.0.0.0"
    
  ,
  "dnx45": 
    "frameworkAssemblies": 
      "mscorlib": "4.0.0.0",
      "System.Xml": "4.0.0.0",
      "System.Collections.Concurrent": "4.0.0.0"
    
  ,
  "dotnet": 
    "dependencies": 
      "System.Collections": "4.0.0",
      "System.Linq": "4.0.0",
      "System.Runtime": "4.0.0",
      "System.Reflection": "4.0.0",
      "System.Runtime.Extensions": "4.0.0",
      "System.Threading": "4.0.0",
      "System.Text.RegularExpressions": "4.0.0",
      "System.Text.Encoding": "4.0.0",
      "System.Collections.Concurrent": "4.0.0"
    
  
,

尽管this article 建议使用net45 作为monoandroid51 项目的目标,但每当我向其中添加NuGet 包时,Android 项目都会引用dotnet 库。

package.json 然后包含

<package id="My.Awesome.Lib" version="1.2.3-foo9" targetFramework="monoandroid51" />

那里有.csproj

<Reference Include="My.Awesome.Lib, Version=1.2.3.0, Culture=neutral, processorArchitecture=MSIL">
  <HintPath>..\packages\My.Awesome.Lib.1.2.3-foo9\lib\dotnet\My.Awesome.Lib.dll</HintPath>
  <Private>True</Private>
</Reference>

到目前为止,除非我在 dependencies 部分中的版本号高于 4.0.0 并且在我这样做时基本上会燃烧,但是以下情况

但是当我构建项目时,我会收到编译器警告

1>C:\Program Files (x86)\MSBuild\Xamarin\Android\Xamarin.Android.Common.targets(1706,3): 
    warning MSB3277: Found conflicts between different versions of the 
    same dependent assembly that could not be resolved.  These reference
    conflicts are listed in the build log when log verbosity is set to detailed.

在图书馆参考之后。在 Visual Studio 中,每当我将 Android 项目中的值传递给其中一种库类型时,我都会看到红色的波浪线以及一条消息说明

The type 'DateTime' is defined in an assembly that is not referenced. 
You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, ...

还有

Argument type 'System.DateTime [mscorlib, Version=2.0.5.0, Culture ...]' is
not assignable to parameter type 'System.DateTime [mscorlib, Version=4.0.0.0, ...]'

这很有意义,因为 Xamarin BCL 被标记为运行时版本 v2.0.50727,而我的库是 v4.0.30319

我现在想知道是否需要针对某些 PCL 目标,或者我是否还缺少其他目标。

【问题讨论】:

你读过github.com/aspnet/dnx/issues/1653吗? @Cheesebaron 遗憾地针对.NETPortable,Version=v4.5.1,Profile=Profile111.NETPortable,Version=v4.5,Profile=Profile111 对我不起作用,即使有大量明确声明的依赖项。它们都标有感叹号,因此似乎找不到它们。尽管dnu restore 没有抱怨,但似乎我在那里使用了错误的提要。 好的,我建议你问 Xamarin,也许通过他们的 Bugzilla。 我想我设法开始使用配置文件 259 和链接。到目前为止看起来不错,只是还不相信和平。 :)) 这方面有什么进展吗?我在从 Xamarin 引用“project.json”样式的 nuget 包时遇到了同样的高级问题。在框架中设置 PCL 配置文件(以及我尝试过的其他方法)不起作用(即,github.com/nexussays/core/blob/master/src/nexus.core/…) 【参考方案1】:

目前尚不支持。为了支持这种情况,nuget 也需要更新以负责正在考虑简化引用的新名字。

在未来,您将只针对 netstandard1.4 而不是 dnxcore50,并且您将运行所有内容并与 Xamarin 兼容。

.NET Standard Platform

这就是事情的发展方向。简化针对多个平台的疯狂行为。这就是我获得netstandard* 绰号的地方,当然,在它发布之前......这仍然可能会发生变化。

【讨论】:

以上是关于在 DNX 项目中,如何以 Xamarin Android 为目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在生产和开发环境中始终如一地获得 ASP.NET 5 DNX 项目的应用程序基础路径?

结合CLR类库发布ASP.NET vNext/DNX

如何诊断 dnx 中缺少的依赖项(或其他加载程序故障)?

如何以 xamarin 形式将一个内容页面从客户端项目(IOS/Android)导航到另一个内容页面?

json VS南希项目DNX项目由YO创建

Xamarin:如何删除网格中特定行中的项目