如何通过另一个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,如果涉及第三方程序集(由于许可),可能无法实现。