是否可以加载引用的DLL,即使它没有被调用?

时间:2009-10-01 12:35:46

标签: c# .net clr

环境:.NET / VS2008

大家好,

我的应用程序使用单独安装在某些系统(明确标识)上的第三方DLL程序集,但不是全部。

这意味着在某些系统上,DLL不存在,因此不得调用。为了解决这个问题,我为2个用例提供了2个版本的应用程序(使用2个配置)。在其中一个中,对DLL的所有调用都是#if'ed out。

由于在应用程序中根本没有编译DLL编译(它们是#if'ed),是否可以安全地假设应用程序即使引用了该DLL也不会尝试加载DLL?

或者我也应该排除引用?

注意:在this question中对womp的评论作出回应。

TIA,

4 个答案:

答案 0 :(得分:3)

IIRC,C#编译器将省略对dll的引用,这些引用从未在代码中实际使用过。因此,如果所有代码都在#if内,那么对于dll的引用将不会出现在您编译的应用程序中,并且dll将永远不会被加载。

顺便说一句,您可以使用Reflector进行检查。只需拖动和放大将已编译的应用程序放入Reflector,然后查看References节点。我认为ILDASM也提供了这个功能。

警告:DllImport和动态类型加载(例如,Type.GetType("type,dll"))将动态加载dll而无需C#编译器知道或关心。但同样,如果在正确的#if内,则不会加载任何内容。

答案 1 :(得分:0)

如果您从未(显然)实例化并引用类,那么您可以安全地使用引用但没有实际的DLL,并且永远不会在任何实例化或引用的对象中引用该类。

通常,您的DLL将在第一次运行引用的类的类构造函数时加载。

HTH 扬

答案 2 :(得分:0)

我会排除它。它可能无论如何加载它,如果你有类型引用,那么这也可能导致问题。

答案 3 :(得分:0)

为什么不在需要/可用时动态加载程序集?然后,如果它在以后添加,你可以使用它吗?您只需要一个版本的应用程序。