我正在编写一个类库(称为mylibrary.dll),它本身引用了更多的库 - >使用以下DLL(从package.config获取版本概述):
<package id="EntityFramework" version="6.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net45" />
<package id="System.Data.SQLite" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.Core" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.EF6" version="1.0.99.0" targetFramework="net45" />
<package id="System.Data.SQLite.Linq" version="1.0.99.0" targetFramework="net45" />
<package id="UnmanagedExports" version="1.2.7" targetFramework="net45" />`
Run Code Online (Sandbox Code Playgroud)
mylibrary.dll是一个包装器,它将一些托管代码公开给需要非托管代码的调用者(换句话说,预期本机DLL条目的位置).
如果我通过NUnit测试方法测试mylibrary.dll的公共接口,则根本没有错误.但是,如果我通过targetapplication.exe的相同界面调用相同的方法,我会认识到以下情况:
var vResponseObject = await vResponse.Content.ReadAsAsync <ApiResponse <T >>().ConfigureAwait(false);
在幕后,ReadAsAsync调用使用Newtonsoft.JSON反序列化类型的对象<T>.看来这个函数是生成错误的函数:
无法加载文件或程序集'Newtonsoft.Json,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = ...........'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)
HTTPContent.ReadAsAsync由Microsoft.AspNet.WebApi.Client(扩展System.Net.Http)提供,它本身依赖于Newtonsoft.JSON版本6.0.x(请参阅此程序包的NuGet依赖项).未安装版本6.0.x,而是安装版本8.0.x. 因此需要在app.config中管理的可装配重定向:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly> …Run Code Online (Sandbox Code Playgroud) 我无法让 Fody.Costura 在 .NET Core 2.1 或 .NET Standard 2.0 库中运行。wiki 和开放问题似乎没有直接回答这个问题:与经典 .NET Framework 项目(.exe 或 .dll)相比,必须采取哪些不同的做法。
出于测试目的,我创建了 4 个项目:
我将 Fody(最新 5.1)和 Costura(最新 4.0)添加到所有项目中。
然后我为所有项目创建了完全相同的 FodyWeaver.xml。
我使所有项目都依赖于 Newtonsoft.Json(根据 Nuget 添加它,并在使用 Newtonsoft.Json 的每个项目中创建一个类)。
我构建了它们并检查了输出 -> Newtonsoft.Json 不在预期的输出目录中。但是,当使用 ILSpy 查看创建的 .dll 文件时,仅 .NET Framework 项目中的二进制文件包含一个 Resources 文件夹,其中包含 Newtonsoft.Json.Dll。
从我在 wiki 中读到的内容来看,不应该有进一步的设置。这些问题并不是说 .NET Core 和 Standard 不受支持,即使正在进行改进等。有人知道如何让这里的东西正常工作吗?对我不认识的文档有任何提示吗?
.NET Core 和 Standard 项目的最终 Dll 应包含 Newtonsoft.Json.dll
如果我在 FodyWeavers.xml …
我想知道在什么情况下使用时会遇到问题
ConfigureAwait(false)
Run Code Online (Sandbox Code Playgroud)
在我的(Xamarin)MVVM 方法中。这主要是因为我不完全理解视图和视图模型及其属性和底层模型之间的同步上下文......
1可观察集合呢?
// VM
public ObservableCollection<SomeThing> SomeThings { get; set; }
// ...
public Task InitWorkload()
{
SomeThings = await DbService.GetSomeThings(); // <-- Should need synchronization context, doesn't it?
}
// Service
public Task<SomeThings> GetSomeThings()
{
result = await CallToDb.ConfigureAwait(false); // <-- This is UI agnostic and shouldn't care about context or does it?
return result;
}
Run Code Online (Sandbox Code Playgroud)
2导航怎么样(在本例中是在 FreshMvvm 的帮助下)?
private async Task CloseWindow()
{
await CoreMethods.PopPageModel(); // <-- Should need synchronization context, doesn't it? …Run Code Online (Sandbox Code Playgroud)