从插件加载程序集

时间:2019-07-02 08:06:49

标签: c# .net-assembly autodesk-navisworks

简介

我正在为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...

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

我错过了一些解决方案吗?

1 个答案:

答案 0 :(得分:1)

您遇到此问题是因为您无法加载.NET程序集的两个不同的 non - strong-named 版本(无论它在文件系统上的什么位置)进入相同的AppDomain。默认情况下,您从一个过程开始,该过程称为单个AppDomain,称为主AppDomain。

强名称程序集是采用文件名的程序集;版;对密钥和文化进行签名以生成唯一的程序集。

  

现在,我要做的是使用另一个进程,该进程可以加载正确的程序集并从此处下载/上传文件,但我想避免使用第二个进程。

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

  

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

那是行不通的,它与让.NET自动为您完成操作基本相同。

您可以将多个版本的.NET程序集加载到同一AppDomain中的唯一时间是,该程序集(在本例中为NuGet程序包)和从属程序集均都是强名称。由于某些原因,我一直无法理解为什么大多数开源.NET开发人员拒绝使用强名称程序集。