【问题标题】:How to access namespaces in a DLL via another DLL?如何通过另一个 DLL 访问 DLL 中的命名空间?
【发布时间】:2012-10-01 07:43:56
【问题描述】:

我有多个 DLL(我自己管理或不自己管理),我想将它们包含在 CoreLib.dll 中,这样我就不必在每个使用这些 DLL 的应用程序中包含(可能)数百个 DLL。我包含直接引用 DLL 的 DLL。

所以,我还想在我正在创建的应用程序中实例化在这些 DLL 中声明的类。我不能做 MyApp.exe 项目中所描绘的事情,即使我愿意。 CoreLib 中没有对 A、B 或 C 的引用。

我怎样才能完成我想要的?

编辑 我按照建议使用了外观模式,但是出现了编译错误。它说我必须在 MyApp 项目中包含 A.dll。为什么?这是我想避免的。有什么办法吗?

【问题讨论】:

  • 不确定这是否重复,但它可能会让你到达某个地方...stackoverflow.com/questions/12307602/…
  • 您打算如何知道这些不同 dll 中的类型?
  • 您可能正在尝试插件架构:stackoverflow.com/questions/1071265/…
  • 我可以通过知道命名空间来获取我的 A、B、C dll 中可用的类型,并让自动完成告诉我什么是可用的。不过,我不想要插件架构。我只是不想拥有 100 个 DLL,我想合并到一个 DLL 中,而不是使用 ILMerge,它将 DLL 和 EXE 合并到一个 EXE 中。我希望能够重用 CoreLib dll,并可能将 dll 提供给其他人,以便他们也可以使用它。
  • @Tizz ILMerge 可以将 dll 合并到另一个 dll 中!您只需告诉它输出一个 dll - 请参阅我更新的答案。

标签: c# dll


【解决方案1】:

我认为这是不可能的。在 CorLib 中添加对 A、B 和 C DLL 的引用仅意味着 CorLib 引用了这些 DLL(AssemblyRef 元数据表将为每个程序集提供一条记录)。这并不意味着 CorLib 重新定义了程序集和任何类型的引用程序集。在 MyApp.exe 中,您需要引用 A、B 和 C 程序集。

另一种解决方案是在 CorLib 中定义 Facade 类并将调用重定向到 A、B 和 C DLL。在 MyApp.exe 中,您将使用 Facade 类。

【讨论】:

  • 我喜欢使用 Facade 类的想法,但是,如果我在类中有静态方法怎么办?我不能带来静态方法(或静态类)。
  • 您可以重新定义 Facade 类中的方法,然后将调用委托给原始方法\类。 Static\Instance 方法不会有任何区别。
  • 所以我做了所有这些(这花了一些时间,因为有很多方法和类和变量,现在它说MyApp.exe项目需要引用A.dll。这就是我的首先试图避免。任何想法我做错了什么?或者没有做什么?我已经更新了我上面的问题。
  • 我认为客户端需要引用 A 和 B DLL。但是客户端不需要从 A 或 B DLL 访问任何类。客户端只需要与您的 Facade 类进行交互。这类似于企业库异常处理和日志记录块。当使用 Enterprise Library 应用程序块记录一些信息或处理一些异常时,客户端只需要与 Facade 类(例如 Logger)进行交互,但客户端需要引用该块使用的所有 DLL。
【解决方案2】:

您可以使用ILMerge 将程序集合并为一个。

然后,您可以按照自己的方式使用该程序集中的所有类。

以下是如何将多个程序集 (dll) 合并​​为一个程序集 (dll) 的示例: http://www.fishofprey.com/2011/01/ilmerge-to-combine-multiple-dlls.html

基本上你就是这么做的

ILMerge.exe /out:CoreLib.dll A.dll B.dll C.dll

【讨论】:

    【解决方案3】:

    我认为您将 DLL(在本机托管世界中包含实际实现)与包含将在构建时合并到 EXE/DLL 中以将实现包含到相应 EXE/DLL 中的内容的 LIB/OBJ 文件混淆了。

    您基本上有两个选择:

    • 在您的应用程序中携带所有 DLL(正常方法,除非您有奇怪的要求,否则应该采用)。您可以直接从主应用程序引用程序集并创建类,也可以在 CoreLib 程序集中创建某种工厂来按需创建类。在以后的情况下,您可能不需要添加对所有 A..C 程序集的引用(如果您不直接使用类,而是通过一些共享接口/基类),但仍需要携带它们。
    • 某种将程序集合并为一个(即 @Alex 建议的 ILMerge)。这种方法需要比第一种方法更好地理解 CLR,并且如果涉及第三方程序集(由于许可)可能无法实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      相关资源
      最近更新 更多