C# 即使引用的DLL';没打电话吗?

C# 即使引用的DLL';没打电话吗?,c#,.net,clr,C#,.net,Clr,环境:.NET/VS2008 大家好 我的应用程序使用第三方DLL程序集,这些程序集分别安装在一些系统(明确标识)上,但不是所有系统 这意味着在某些系统上,DLL不存在,因此不能调用。为了解决这个问题,我为这两个用例提供了两个版本的应用程序(使用两种配置)。在其中一种情况下,对DLL的所有调用都是“如果”退出的 由于在应用程序中根本没有对编译的DLL的调用(它们是#if'ed out),因此可以安全地假设应用程序即使被引用也不会尝试加载DLL吗 或者我也应该排除引用 注:针对womp在中的评论提

环境:.NET/VS2008

大家好

我的应用程序使用第三方DLL程序集,这些程序集分别安装在一些系统(明确标识)上,但不是所有系统

这意味着在某些系统上,DLL不存在,因此不能调用。为了解决这个问题,我为这两个用例提供了两个版本的应用程序(使用两种配置)。在其中一种情况下,对DLL的所有调用都是“如果”退出的

由于在应用程序中根本没有对编译的DLL的调用(它们是#if'ed out),因此可以安全地假设应用程序即使被引用也不会尝试加载DLL吗

或者我也应该排除引用

注:针对womp在中的评论提出此问题


TIA,

如果您从未(显然)实例化和引用类,也从未在任何实例化或引用的对象中引用该类,那么您使用引用是安全的,但没有实际的DLL

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


一月

我会把它排除在外。无论发生什么,它都可能加载它,如果您有类型引用,那么这也可能导致问题。

如果需要/可用,为什么不动态加载程序集?如果它在以后添加,你就可以利用它了?你也只需要一个版本的应用程序。

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

顺便说一下,你可以用反射器检查一下。只需将编译后的应用程序拖放到Reflector中,然后查看References节点。我认为ILDASM也提供了这个特性


警告:
DllImport
s和动态类型加载(例如,
type.GetType(“type,dll”)
)将在C#编译器不知道或不关心的情况下动态加载dll。但是,如果在适当的
#如果
s中,则不会加载任何内容。

这是我最终要做的。该案例发生在紧急支持呼叫期间。很抱歉回答您的问题,如果您从未(显然)实例化和引用类,并且从未在任何实例化或引用的对象中引用该类,那么您使用引用是安全的,但没有实际的DLL。