在.NET中共享程序集

4
我们的应用程序使用大量自定义和第三方库,每个应用程序都有对这些程序集的私有引用,这意味着每个应用程序的bin文件夹中都有所引用的程序集的副本。例如,Application A 引用 log4net.dll、CustomLibA.dll 和 CustomLibB.dll,而 Application B 也引用 log4net.dll、CustomLibA.dll 和 CustomLibB.dll,这些程序集存储在以下结构中。
D:\Inetpub\wwwroot\ApplicationA\bin D:\Inetpub\wwwroot\ApplicationB\bin
我有以下问题:
1. 我认为这会创建性能问题,因为应用程序数量和引用数量增加后,每个应用程序都将加载所有这些程序集,这将导致虚拟地址碎片化。我的假设正确吗?
2. 我可以组织应用程序,使得所有这些应用程序都引用来自公共文件夹的程序集,并且不在 bin 文件夹中具有私有副本吗?例如,程序集 log4net.dll、CustomLibA.dll 和 CustomLibB.dll 存储在以下文件夹中:
D:\Inetpub\wwwroot\Apps\Common
并由以下方式组织的应用程序进行引用:
D:\Inetpub\wwwroot\Apps\ApplicationA D:\Inetpub\wwwroot\Apps\ApplicationB
这些应用程序的 bin 文件夹中将没有公共程序集。
这样行吗?我尝试通过将 copy local 设置为 false 来实现这一点,但我收到“无法加载文件或程序集 xxxx”的错误。
我知道我可以使用 GAC,但由于我们的部署过程的性质,我想避免对某些自定义构建的库使用 GAC。
谢谢, Hari Krishnan。

这些内容的好参考是《CLR via C#》的前三章。 - Tom Ritter
3个回答

3

您可以随时添加其他路径,以便AppDomain在查找引用时搜索其他文件夹,而不仅仅是bin或gac。
AppDomain.AddReferencePath


1
取决于您使用的框架 AppDomain.CurrentDomain.AppendPrivatePath(path)和AppDomainSetup adSetup = new AppDomainSetup(); adSetup.PrivateBinPath = path - Brandon Grossutti

2

如果您使用GAC,可能会获得性能和代码共享的额外好处。请注意,让所有应用程序引用共享路径不会改变每个应用程序将其自己的程序集加载到内存中的事实。

共享路径唯一的好处是无需部署多个这些程序集的副本。


虽然这并没有回答我的两个问题,但jerryjvl确实回答了第一个问题。谢谢。 - Tech Matrix

1

我认为GAC是常用类库的最佳选择。您仍然可以将自定义库部署到本地\bin目录中。


只要程序集具有强名称。 - Max Schmeling
我同意GAC是分享的最佳场所。我们已经在GAC中安装了第三方库。但是,某些定制构建的库每个月都会进行几次发布,并且由于我们的部署流程,将其部署在GAC中将会很麻烦。 - Tech Matrix

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