控制DLL版本兼容性以获得更大的灵活性

时间:2017-09-19 05:43:20

标签: c#

我有两个C#DLL - 一个“api”dll,一个应用程序接口集合,以及一个“插件”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更改”应该被拒绝。

2 个答案:

答案 0 :(得分: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等。那么你可以在编译之前完全覆盖程序集和文件版本。

答案 1 :(得分:0)

在API项目中查找$total = ($gm.samaccountname | Select -Unique).count 文件。你有一个AssemblyInfo.csAssemblyVersion可以设置为你想要的任何东西。只需确保您在版本中不使用*。 这样,每次构建后版本都会保持不变。

相关问题