2

介绍

我正在为 Navisworks 编写插件,并且正在使用 Dropbox api 从存储库下载/上传文档。

问题

Dropbox.Api使用Newtonsoft.Json.dll版本7.0,问题是Navisworks使用相同程序集的4.0版本,所以我不能使用 Dropbox api,因为它每次都会抛出异常:

System.AggregateException:发生一个或多个错误。---> System.IO.FileLoadException: 无法加载文件或程序集'Newtonsoft.Json, Version=7.0.0.0, ...

据我了解,该程序的程序集为 4.0v,因此 Dropbox.Api 无法正常执行。

到目前为止,我所做的是使用另一个进程,我可以加载正确的程序集并从那里下载/上传文件,但我想避免使用第二个进程。

我正在尝试使用反射在运行时加载程序集,但它没有效果,程序仍然找不到更新的程序集。

//Load the assembly at the beginning of the plugin
var ass = System.Reflection.Assembly.Load(Properties.Resources.Newtonsoft_Json);

//Use the Dropbox api
//Exception...

我可以以某种方式强制程序使用较新的程序集(临时)吗?

有没有我错过的解决方案?

4

1 回答 1

1

您遇到此问题是因为您无法将 .NET 程序集的两个不同的强命名版本(无论它在文件系统上的哪个位置)加载到同一个 AppDomain 中。默认情况下,您从一个名为 Primary AppDomain 的 AppDomain 开始。

强名称程序集是采用文件名的程序集;版本; 签署密钥和文化以产生独特的装配。

到目前为止,我所做的是使用另一个进程,我可以加载正确的程序集并从那里下载/上传文件,但我想避免使用第二个进程。

无需创建第二个进程,您可以在同一进程中创建第二个 AppDomain。每个 AppDomain 都可以加载包括 Newtonsoft.Json 在内的不同版本的程序集而不会发生冲突。

我正在尝试使用反射在运行时加载程序集,但它没有效果,程序仍然找不到更新的程序集。

那是行不通的,它本质上与让 .NET 自动为你做这件事是一样的。

唯一可以将多个版本的 .NET 程序集加载到同一个 AppDomain 的情况是程序集(在本例中为 NuGet 包)和依赖程序集都是strong-named 的。出于某种原因,我一直无法理解为什么大多数开源 .NET 开发人员拒绝使用强名称程序集。

于 2019-07-02T08:42:16.533 回答