如何管理C#/.NET项目中的版本依赖关系?

8
假设你有一个项目A,它有各种dll依赖项,但目录结构看起来像这样:
Project A 
    => Project B
        => Project C
    => Project D
        => Project C
    => Project E
        => Project C, v2

即使项目的其余部分使用较旧版本的同一库,是否有一种方法可以使用Project E,因为它依赖于Project C(dll)的较新版本?

如果没有方法或者有一个方法会导致很多困扰,那么是否有一种前瞻性的解决方案来防止这种情况在未来的项目中发生?


1
所有项目都在同一个解决方案中吗? - jrummell
可能是重复的问题:如何处理多个依赖版本? - jrummell
需要回答的一个问题是C项目的v2版本是否向后兼容。如果B和D项目使用新版本,它们是否仍然可以正常工作?这个问题似乎与你的情况相关:https://dev59.com/22855IYBdhLWcg3wQx1L - Dr. Wily's Apprentice
1个回答

5

从一个更长远的解决方案来看,在您的环境中不确定是否可行,但我们有多个依赖项目(从框架到依赖系统)需要引用。我们使用Subversion并使用externals来引用库/源文件夹,以便所有依赖项目引用相同的版本。

我们还有一些项目,其中引入了依赖库,可能在编译时使用了旧版本,而主要引用应用程序已包含新的向后兼容的共享库。在这种情况下,我们使用多个版本解决方案,该解决方案使用配置条目。

实际上,我们的构建过程会打印出类似以下内容的东西(其中_BUILD_VERSION_由构建过程替换为当前构建号):

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Company.DependentAssembly" publicKeyToken="8510b56c219df72e"/>
            <bindingRedirect oldVersion="1.0.0.0-99.0.0.0" newVersion="_BUILD_VERSION_"/>
        </dependentAssembly>

同一篇文章还介绍了在项目中引用多个版本的相同程序集的方法。

你可能还可以处理 AppDomain.AssemblyResolve 事件。这里有一个例子 - Uwe Keim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接