【问题标题】:How to replace a loaded assembly如何替换加载的程序集
【发布时间】:2018-01-24 04:17:03
【问题描述】:

好的,所以我这里有一个非常独特的问题。我收到一个错误,基本上是因为我引用了最新版本的 dll,我仍然希望默认保留对它的引用,因为我的项目中的大部分代码都应该使用这个 dll。发生错误是因为它试图使用仅在旧版本的 dll 中可用的对象。所以我想在这段特定的代码中使用这个旧版本的 dll。我尝试使用Assembly.LoadFrom(pathToAssembly) 加载这个旧版本的dll,但它似乎仍然引用了新版本的dll。有没有人知道如何将这个 dll 的引用替换为旧版本?

【问题讨论】:

  • 您无法在运行时更改程序集。 Link 你可以使用Assembly.LoadFile 而不是Assembly.LoadFrom 然后调用 CreateInstance 方法,你想从旧的 dll 中创建对象
  • 如何将您的代码分成不同的项目,以便它们具有不同的引用集。
  • @DaniDev 奇怪的建议...为什么您认为针对不同版本的非强签名程序集进行编译会以某种方式有助于在运行时加载两个版本?
  • @Alexei Levenkov“不同版本的非强签名程序集”不确定这就是我的建议。我要说的是,如果 OP 可以梳理出需要旧版本(ddl)的功能并独立编译,他可以安全地在主项目中加载/编译新版本。
  • @DaniDev 所以你的建议实际上是“只在单独的进程中运行代码”?这不是我从问题中得到的,因为 OP 似乎希望同时在同一进程中运行两段代码,但针对不同版本的程序集。请注意,我可能会完全误解 OP,也可能会误解您的评论...考虑将其实际转换为答案,以便您可以清楚地解释所有步骤。

标签: c# asp.net .net dll .net-assembly


【解决方案1】:

您唯一真正的选择是确保程序集是强签名的,确保没有程序集绑定重定向到较新版本,而不是手动(使用Assembly.LoadFrom)将第二个版本加载到您的 appDomain 中。这样代码将能够使用精确版本的程序集,并且两个程序集可以同时加载到同一个 appDomain 中。

请注意,如果您需要在链接到不同程序集的代码片段之间传递对此类对象的引用,这将导致彻底的噩梦。

如果您想要额外的痛苦乐趣 - 从字节加载两个程序集并使用反射构造每个版本的类型...

我强烈建议通过使用不同版本的程序集将代码加载到至少单独的 appDomain,但最好是单独的进程来避免所有痛苦。如果您仍然决定冒险将多个版本的程序集加载到同一个 appDomain,请务必阅读来自 https://blogs.msdn.microsoft.com/suzcook/2003/09/19/loadfile-vs-loadfrom/ 的所有程序集加载博客文章

【讨论】:

  • 他/她不能在加载程序集之前创建一个新的app-domain 吗?
  • @AliBahraminezhad 这正是我在帖子中建议的“通过使用不同版本的程序集加载代码到至少单独的 appDomains” - 所以不确定您的评论是关于什么的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 2021-03-02
相关资源
最近更新 更多