如何通过另一个DLL访问命名空间中的一个DLL?(How to access namespaces

2019-08-01 08:13发布

我有多个DLL(无论是管理自己或不管理自己),我想在一个CoreLib.dll包括这样我就不必包括(可能)几百个的DLL在使用这些DLL的每个应用程序。 我包括直接引用到DLL动态链接库。

所以,我也想实例化,我创建了应用这些DLL内声明的类。 我不能做什么是MyApp.exe的项目合照,即使我想。 还有就是A,B或C中corelib的没有引用。

我怎样才能做到我想要什么?

编辑我用外观模式的建议,但我得到一个编译错误。 它说我必须包括在A.DLL MyApp项目。 为什么? 这正是我想避免。 解决这个办法?

Answer 1:

我不认为这是可能的。 添加参考A,B和C的DLL中CorLib将仅意味着CorLib引用这些DLL(AssemblyRef元数据表将具有用于每个组件一个记录)。 这并不意味着CorLib重新定义了组件和任何类型的引用的组件。 在MyApp.exe的,你就需要引用A,B和C组件。

另一种解决方案是定义在CorLib一个门面类和重定向到A,B和C的DLL呼叫。 在MyApp.exe中,你将使用Facade类。



Answer 2:

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


Answer 3:

我想你混淆了DLL(这是本土管理世界包含实际的实现)与包含的东西,将在编译时被合并成EXE / DLL包含执行到相应的EXE / DLL LIB / OBJ文件。

你有本质上2种选择:

  • 携带所有DLL与应用程序(正常的做法,应该采取除非你有奇怪的要求)。 您可以参考直接从主应用程序和创建类或使你的corelib的装配一些工厂,将根据需要创建类的组件。 在后一种情况下,你可能不需要引用添加到所有A..C组件(如果你不使用类直接,而是通过一些共享接口/基类),但仍需要随身携带它们。
  • 某种合并组件到一个(即由ILMerge作为@Alex建议的)。 这种方法需要更好地了解CLR不是第一个,如果第三方组件涉及(由于授权)可能是不可能的。


文章来源: How to access namespaces in a DLL via another DLL?
标签: c# dll