【问题标题】:Use custom version of assembly for all dependencies对所有依赖项使用自定义版本的程序集
【发布时间】:2020-11-03 02:12:14
【问题描述】:

我的项目使用了 Newtonsoft.Json 库的 modified version 并进行了一些更改,以便与 AOT 配合使用。修改后的 dll 已添加为项目的参考程序集。我的项目还使用了一组附加库(一些通过 Nuget,一些通过附加项目包含),其中一些库还对 Newtonsoft.Json 有自己的依赖关系。

  1. 最终版本中将包含哪个版本的 Newtonsoft.Json?
  2. 我可以映射所有版本以使用修改后的库吗?也许通过 BindingRedirect?

【问题讨论】:

  • 可以分享项目文件的例子吗?
  • 你的修改版本可以改成不同的名字吗?
  • @JoeSewell 当然,如果需要,我可以调整名称或版本。我只需要项目中的所有库也使用修改后的版本,否则它们将无法运行。
  • @PavelAnikhouski 我可以制作一个删除私人信息的 sn-p。您是否特别希望在项目中有所帮助?
  • @AndySavage 它甚至可以在没有BindingRedirect 的情况下工作。最终构建将包括您的项目在构建时引用的版本。如果您删除通过 nuget 引用添加到项目中的 Newtonsoft.Json 并直接添加修改后的 dll,它可能无需任何配置即可正常工作,但这取决于您引用的 dll 所需的版本。问题是当你下次更新你的 nuget 包时,他们会用他们自己的 Newtonsoft.Json 版本覆盖这个自定义引用,我不知道如何告诉他们不要这样做。

标签: c# .net dependencies assemblies


【解决方案1】:

应该可以让外部库使用 AppDomain.CurrentDomain.AssemblyResolve 加载您的 dll

  1. 使您的 fork dll 具有与 Newtonsoft.Json 不同的名称
  2. 在您的项目中引用它
  3. 在构建后事件中添加命令行以从目标目录中删除 Newtonsoft.Json.dll
  4. 作为项目的第一行代码(在 Windows 应用程序的情况下在 Program.cs 内,在 Web 应用程序的情况下在 Global.asax Application_Start 内)添加以下代码:
AppDomain.CurrentDomain.AssemblyResolve += 
    (s, a) => {
        if (a.Name.Contains("Newtonsoft.Json"))
          return Assembly.LoadFrom(@"PATH TO YOUR DLL HERE");
        else
          return null;
              };

如果是 Web 应用程序,您可以使用 Server.MapPath 获取 dll 的路径

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2014-05-21
    • 2016-12-05
    • 2011-02-24
    • 1970-01-01
    • 2011-09-28
    • 2017-04-27
    相关资源
    最近更新 更多