【问题标题】:Avoid assembly reference problems generally一般避免装配参考问题
【发布时间】:2015-07-21 19:45:12
【问题描述】:

我搜索了很多,但还没有找到解决方案。

我们为我们的客户提供了许多程序,它们在一个目录中具有共享库 (dll)。但是,如果一个库得到更新,我们必须重新编译所有引用该 dll 的程序。如果我们不这样做,我们的客户端在调用库中的函数时会出错 (The located assembly's manifest definition does not match the assembly reference)。

我们想像往常一样引用一个库,当一个库升级时,程序应该只使用新版本而不是抛出错误。

部分问题在于,该引用在内部使用版本号进行了修复。我的第一个想法是在引用之前删除dll的版本号。但这可能吗?

如果有任何(其他)想法或建议如何绕过参考问题,我将不胜感激。这可能是重复的,但我还没有找到带有解决方案的帖子 - 只是描述原因的帖子。

【问题讨论】:

  • 部分答案是使用Assembly Binding Redirect...
  • 将共享库打包成一个或多个相互依赖的 NuGet 包,并配置依赖版本号以确保每个包都依赖于其他兼容包。当 dll 发生变化时发布一个新的包。客户端永远不会看到不兼容的文件。在客户端升级单个包也会升级所有其他包

标签: c# .net dll


【解决方案1】:

关于程序集绑定重定向 - https://msdn.microsoft.com/en-us/library/433ysdt1(v=vs.110).aspx (one more msdn link) 怎么样?

您可以在配置中指定重定向到新版本,因此不需要重新编译。但是,如果您正在使用的类\方法的签名将被更改 - 那么它无论如何都会引发异常。

ASP.Net MVC 使用这种方法来指定重定向到新版本的 MVC:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

【讨论】:

  • 为此工作,请确保程序集是强类型化并安装在 GAC 中,这是版本有助于区分文件的地方
  • 它不应该出现在 GAC 中。从 4.0 开始的 MVC 程序集由 nuget 安装。 publicKeyToken 不是 assemblyIdentity 节点中的必填字段,但我不确定没有它它是否能工作
  • 感谢您的建议。我目前正在调查它,但它还没有工作。我在带有以下标记的项目中编辑了 app.config 文件: 我用旧的 dll 编译它,然后通过文件资源管理器手动用新的 dll 替换旧的。 exec 上出现引用错误。
  • 我没有工作,因为我错过了 assemblyBinding 上的属性 xmlns="urn:schemas-microsoft-com:asm.v1"。我现在将尝试使此配置适用于整个目录,而无需重新编译
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多