如何通过另一个DLL访问DLL中的命名空间?

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

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

在此处输入图像描述

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

编辑我按照建议使用了Facade Pattern,但是我收到了编译错误。 它说我必须在MyApp项目中包含A.dll。 为什么? 这是我想要避免的。 有什么方法吗?

在此处输入图像描述

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

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

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

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

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

Essentaily你就是这么做的

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

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

你基本上有两个选择:

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