环境:.NET / VS2008
大家好,
我的应用程序使用单独安装在某些系统(明确标识)上的第三方DLL程序集,但不是全部。
这意味着在某些系统上,DLL不存在,因此不得调用。为了解决这个问题,我为2个用例提供了2个版本的应用程序(使用2个配置)。在其中一个中,对DLL的所有调用都是#if'ed out。
由于在应用程序中根本没有编译DLL编译(它们是#if'ed),是否可以安全地假设应用程序即使引用了该DLL也不会尝试加载DLL?
或者我也应该排除引用?
注意:在this question中对womp的评论作出回应。
TIA,
答案 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)
为什么不在需要/可用时动态加载程序集?然后,如果它在以后添加,你可以使用它吗?您只需要一个版本的应用程序。