【问题标题】:Controlling DLL version compatibility for more flexibility控制 DLL 版本兼容性以获得更大的灵活性
【发布时间】:2017-09-19 05:43:20
【问题描述】:

我有两个 C# DLL - 一个“api”dll,一个应用程序的接口集合,以及一个“plugin”dll,即使用 API 扩展我们的应用程序的代码。

每当我进行新的“api”构建时,插件 dll 都无法在我们的应用程序中加载:

模块中的类无法加载。

要解决这个问题,我们只需重建插件(因为它使用“最新”的 API dll。

我的猜测是它与 Visual Studio 或编译器如何对 DLL 进行版本控制有关。现在 API dll 版本化为 1.0.6469.2848,这是自动化的。

我需要更多的灵活性,但我不知道如何去做。我在寻找解决方案时选择了错误的术语。

最好,我想要更接近 semver 的东西 - 如果我的插件 DLL 是针对 api 版本 1.0.1 编译的,即使我的应用程序具有 api 版本 1.0.2 或 1.1,它也应该继续加载/工作。只有 2.x,“向后兼容性破坏 API 更改”应该被拒绝。

【问题讨论】:

  • 你是在编译这些dll还是第三方?

标签: c#


【解决方案1】:

我想你已经发现,是汇编版本搞砸了你。这是因为插件的版本构建/宏号已经增加,并且应用程序是针对以前的版本构建的。

您可以通过多种方式处理此问题。

  • 在应用程序配置中,您可以执行binding redirect 以便加载较新的版本。
<dependentAssembly>
  <assemblyIdentity name="someAssembly"
     publicKeyToken="32ab4ba45e0a69a1" culture="en-us" />  
  <bindingRedirect oldVersion="1.0.0.0-7.0.0.0" newVersion="8.0.0.0" />  
</dependentAssembly>  
  • 或者,我可能会采用和坚持 semver 的路线,我会手动控制 AssemblyVersionAttribute (1.2.3),仅在发生重大更改时递增。 AssemblyFileVersionAttribute 我会随着构建增加,以便您可以确定 dll 的实际构建版本。您可以在AssemblyInfo.cs 中更改此设置

我确实回答了另一个 question 关于程序集版本控制的问题,这可能会有所帮助。

注意

根据您构建程序集的方式(本地或在构建服务器上),生成版本号的方式会有所不同。如果您在本地构建,则需要,正如 Sylence 在他的回答中指出的那样,更改 AssemblyVersionAtribute 中的通配符。如果您使用的是 TeamCity、Jenkins 等构建服务器。那么您可以在编译之前完全覆盖程序集和文件版本。

【讨论】:

  • AssemblyVersion 是影响其他 DLL 是否“可加载”的值,还是 AssemblyFileVersion?除了手动控制版本之外,我还需要确保针对 API 版本 1.0.0 编译的插件在使用 API 版本 1.0.1 时仍然可以工作。我想坚持使用 semver,所以只有 2.x 会包含重大更改,所以 v 1.0.1 或 1.1 对于针对 v1.x 编译的 mod 应该是安全的
  • @helion3 是的,它是 AssemblyVersion。文件版本仅供参考。如果您针对 1.0 进行编译然后尝试使用 1.1,您将遇到问题。这就是绑定重定向会有所帮助的地方。但是,如果您有一个已知的接口或基类,您可以考虑在运行时将程序集加载到相同或单独的应用程序域中。您也可以查看 MEF,尽管我认为它已被另一个 net.core 框架所取代。
【解决方案2】:

在您的 API 项目中查找 AssemblyInfo.cs 文件。在那里你有一个AssemblyVersionAssemblyFileVersion,你可以设置为任何你想要的。只要确保您不在版本中使用 * 即可。 这样每次构建后版本都会保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多