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

时间:2012-10-10 18:35:52

标签: c# dll

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

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

enter image description here

我如何实现我想要的目标?

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

enter image description here

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您可以使用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

答案 2 :(得分:0)

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

您基本上有两个选择:

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