3

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

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

在此处输入图像描述

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

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

在此处输入图像描述

4

3 回答 3

2

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

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

于 2012-10-10T18:44:30.247 回答
1

您可以使用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
于 2012-10-10T18:56:18.060 回答
0

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

您基本上有两个选择:

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