C# 依赖程序集何时实际加载

C# 依赖程序集何时实际加载,c#,.net,C#,.net,在“Test.dll”中给出以下内容 如果在另一个程序集(不是“Test.dll”)中定义了“Whatever”,那么只有当“process”为true时才会加载该程序集(假设“Whatever”从未在其他地方使用)。更重要的是,如果定义了“Whatever”的程序集仅在“process”为true时实际存在于主机上,那么在“process”为false时是否会发生运行时错误。提前感谢。调用方法(包含示例代码的方法)时,它会加载它。CLR需要弄清楚该方法将做什么,该过程的一部分是加载程序集和初始

在“Test.dll”中给出以下内容


如果在另一个程序集(不是“Test.dll”)中定义了“Whatever”,那么只有当“process”为true时才会加载该程序集(假设“Whatever”从未在其他地方使用)。更重要的是,如果定义了“Whatever”的程序集仅在“process”为true时实际存在于主机上,那么在“process”为false时是否会发生运行时错误。提前感谢。

调用方法(包含示例代码的方法)时,它会加载它。CLR需要弄清楚该方法将做什么,该过程的一部分是加载程序集和初始化类型


因此,CLR将在检查进程之前抛出。

它将由即时编译器“即时”加载。在开始运行之前,它需要知道编译此代码时的类型。因此,对流程的测试不足以防止异常。if()语句体中的代码至少需要移动到另一个方法中。该方法需要具有[MethodImpl(MethodImplOptions.Noinling)]属性,以防止在发布版本中过早地进行JIT。而且你必须放弃像Ngen.exe和.NET Native这样的提前编译器。插件框架是明智的。@Hans:非常感谢。那么有什么建议吗。问题在于,“Test.dll”实际上是一个VS加载项,“Whatever”是一个仅在VS2017中可用的类型(在本机VS2017.dll中)。“Test.dll”在VS2013下编译,将引用包含“Whatever”的VS2017程序集(VS2013和VS2017都在我的开发机器上),但在运行时,“Test.dll”可能在VS的任何版本下运行。但是,如果它不是VS2017,则找不到“Whatever”(因为VS2017不在主机上)。只有当“Test.dll”在VS2017下运行时,上面的“process”标志才是正确的。@Hans:为了澄清您的答案(假设您没有其他建议),我可以假设将代码移到另一个方法并应用您提到的属性是安全的。该方法大概只有在“process”为true时才进行JIT编译(因此我提到的VS2017“dll”只会在那时加载)。是这样吗?谢谢
if (process)
{
    Whatever whatever = GetWhatever();
}