【问题标题】:How to avoid C# assembly dependency propagation?如何避免 C# 程序集依赖传播?
【发布时间】:2020-04-25 08:34:29
【问题描述】:

我创建了一个 C# 解决方案(我们称之为“ServiceProviderLib”),它由几个具有解决方案内部程序集引用/依赖项的类库组成。该解决方案只有一个类库,它公开了一个公共接口,旨在被其他一些应用程序用作 api。

A(public) ---取决于---> B ---取决于---> C.

现在我正在开发一个应用程序(我们称之为“ServiceUserApp”),它应该动态链接到“ServiceProviderLib”的 api。

应用程序---取决于---> A.

为了解决对“ServiceProviderLib”的依赖,我使用了 AppDomain.CurrentDomain.AssemblyResolve 的处理程序。

我原以为我只需要解决对 A 的依赖关系。因为 ServiceProviderLib 应该自己解决其内部依赖关系。

但是对于应用程序,我必须将所有依赖项单独解析为 A + B + C。

有没有办法避免这种情况?


关于问题背景的一些信息: 我知道使用静态/动态链接/解析库有很多优点和缺点。

更准确地说,关于我所说的静态/动态:

静态: 在应用程序中,我将引用库 A,并将 Visual Studio 属性“本地副本”设置为默认值“true”。这将导致生成目录中的 dll 副本。在这种情况下,无需手动解析 dll。

动态: 在应用程序中,我将引用库 A 并将 Visual Studio 属性“Local Copy”明确设置为值“false”。在这种情况下,dll 将不会被复制到构建目录...并且必须在运行时解析。

我使用这两种变体很长一段时间,并体验到动态链接在我的特殊环境中导致的问题更少。因此我决定坚持动态。

【问题讨论】:

    标签: c# .net-assembly dependency-management


    【解决方案1】:

    如果“动态链接”是指您在运行时通过反射加载程序集,那么您不会自动获得与编译时引用相同的自动依赖加载。 (CLR 中没有动态/静态链接之类的东西。)

    如果您使用编译时引用,那么您的代码至少会触及每个程序集中的一种类型,并且需要对定义程序集的直接引用才能正确解析它们。如果您删除对 B 和 C 的引用并进行编译,您将准确地看到您引用了哪些 B/C 类型,以及在哪里引用。

    【讨论】:

    • 您好 Artfunkel,感谢您的回复。我更新了我的描述以提供一些额外的信息。也许这有助于更好地理解我的问题。
    猜你喜欢
    • 2014-12-08
    • 2020-04-06
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多