【问题标题】:Load an assembly from plugin从插件加载程序集
【发布时间】:2019-07-03 19:23:15
【问题描述】:

简介

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

问题

Dropbox.Api 使用 Newtonsoft.Json.dll 版本 7.0,问题是 Navisworks 使用4.0 版本的 same 程序集,所以我不能使用 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...

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,但我无法使用第二个 AppDomain 解决问题,它一直抛出异常,我想问题更复杂,我也尝试过在当前 AppDomain 中加载程序集,它使用较新版本加载程序集,但仍然找不到它。我会继续努力的。
    • @Dom93 你是按照什么例子来创建 AppDomains 的?
    • AppDomain的资源:@​​987654321@
    • @Dom93 谢谢。 AppDomains 就是这样做的方法。 This post 再深入一点。一个完整的例子很长,而且过程很复杂。要记住的最重要的事情是创建一个[MarshalByRef] class MyProxy,它会为您在子AppDomain 中完成所有加载。大约在 2005 年左右,有一篇精彩的 MSDN 杂志文章,名为 “[Do you trust it? Extensibility]” (??),其中详细介绍了它
    • @Dom93 通常您不会为某人的答案提供代码(如果之前不存在代码,那么 SO 并不是真正的 Wiki)。此外,您提供的代码存在问题,即您在子域中加载相同的程序集两次,但更重要的是,您还在父域中加载它,这是您不会的不想在您的特定情况下这样做,因为它将您的主要 AppDomain 锁定到该版本。不过,我很欣赏你的努力。不要忘记,您始终可以通过自己发布答案来回答自己的问题。 :)
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多