C# 流行的开源库和引用冲突

C# 流行的开源库和引用冲突,c#,dll,reference,gac,C#,Dll,Reference,Gac,我们在所有(许多)内部应用程序中使用。我们通常会执行相当于xcopy部署的操作。为了方便开发人员,我们将log4net源代码编译到我们的一个核心库中 现在它又回来咬我们了。其他开源库(如)参考log4net。还有一些(例如)将log4net合并到它们的程序集中。通常版本不同 这是一个一般性问题;具体的库只是示例。 有几个类似的问题: 在各种解决方案(GAC、assemblyBinding、bindingRedirect等)中,未来给我们带来的痛苦最少的是什么?我们可以修改我们的核心库

我们在所有(许多)内部应用程序中使用。我们通常会执行相当于xcopy部署的操作。为了方便开发人员,我们将log4net源代码编译到我们的一个核心库中

现在它又回来咬我们了。其他开源库(如)参考log4net。还有一些(例如)将log4net合并到它们的程序集中。通常版本不同

这是一个一般性问题;具体的库只是示例。

有几个类似的问题:

在各种解决方案(GAC、assemblyBinding、bindingRedirect等)中,未来给我们带来的痛苦最少的是什么?我们可以修改我们的核心库;我们不能做任何会破坏现场现有部署版本的事情。更新我们所有的项目引用将是痛苦的,所以我们只想这样做一次


更新:当前版本的Topshelf抽象日志记录,因此这不再是该框架的问题。

存在一个不合并第三方程序集的NServiceBus

发件人:

合并程序集的问题? 为了减少开发人员在VisualStudio项目中需要引用的程序集数量,NServiceBus将多个第三方程序集合并到自己的程序集中。如果开发人员在自己的代码中使用这些第三方程序集,这可能会导致冲突,特别是在使用与NServiceBus附带的版本不同的版本时

为了解决这个问题,开发人员应该使用NServiceBus的“仅核心”程序集。对于已购买商用NServiceBus许可证和支持包的公司,可以在“仅核心”目录中找到这些程序集

如果您使用的是express edition,则需要将源代码(如上所述)拉下来,并使用“UnsupportedBuildCoreOnly.bat”文件自行编译


一个鲜为人知/使用的特性与绑定重定向相结合,我一直在处理多个引用并帮助轻松升级它们。使用引用路径,我能够在源代码管理中的一个单独类库/包中维护一个共享库,其中包含我们正在使用的依赖库

拥有我自己的文件副本,单独控制(如果是付费库,通常需要在共享库文件夹中包含.license文件),允许新开发人员快速确保他们的计算机上安装了正确的版本,与计算机上已有的库不冲突

这种方法需要注意的是,您添加的任何其他引用路径都不会存储在.csproj文件中,而是存储在.csproj.user文件中

在许多箱外源控制解决方案中,如Team Foundation Server或库;默认情况下,这些文件不包括在签入过程中。大多数源代码管理提供程序,包括上面提到的两个,都可以选择更改每个项目以及全局的受控文件扩展名

唯一需要注意的是一些源代码管理提供程序,例如Vault,默认情况下将.csproj.csproj.user文件视为二进制文件;同样,这是可以更改的,在Vault中它们可以被视为XML,从而允许进行合并


在Team Foundation Server中,它们被处理为“框外的XML”。

,在您的情况下,我将用“< /P>”在GAC中部署DLL。 发布者策略程序集是配置.NET运行时绑定到程序集时要使用的策略的程序集。因此,通过在发布者策略中指定必须使用哪个版本的DLL,您可以轻松地更新所有项目

发布程序集策略的示例:



谢谢;我读过。我们实际上没有使用NServiceBus(我们对其进行了评估);这只是一个例子。Craig,虽然我意识到你的答案可能对那些使用NServiceBus的人有所帮助,但如果你编辑它来解决一般问题,你将有机会尝试一下100个代表:)仅供参考,你可以非常轻松地自动处理
.proj
文件,它们只是MSBuild脚本。我知道你不想给他打点,但也不太痛苦。@Joe-真是个好主意!它们只是XML。请注意,VS编写MSBuild文件的方式与您编写MSBuild文件的方式不同。@Joe-我们应该在VS中添加对一个项目的引用,检查差异,然后使用XML解析器在其他项目的同一区域插入同一引用。有什么大的风险吗?我只能说尝试一下,然后在VS中运行几次。IIRC将项目树保存为MSBuild格式,然后在保存时将MSBuild格式解析回该树。因此,它可能会破坏任何给定的输入。我已经有一段时间没有这么做了,但我记得在有趣的地方插入变量很好,但是如果你试图用GUI对同一件事进行更改,VS会做一些奇怪的事情。对不起,不能再含糊其辞了+1.有一段时间,我们签入.csproj.user以在“调试”选项卡上共享启动操作,但这导致了问题(特别是当我们的路径因分支而更改时)。这一点很好,可以有所缓解,但这是一个令人头痛的问题。我想您的另一个选择是托管一个自定义NuGet包,并签入包文件…一点前期工作,但它是内置的。+1-谢谢!我非常倾向于GAC解决方案,但我不知道政策选项。