如何在不使用时防止装配

Enr*_*ico 3 .net c# .net-assembly winforms

我在Winforms,C#.NET4.5工作

我在程序集A中有一个名为classA的类,它提供了method1

在我的主程序集中,我可以调用此方法,但在某些情况下,我100%确定这不会发生,因为来自注册表项的一些内部标志:

if( valueFromRegistryIsAlwaysFalse)
{
   var A = new classA();
   A.method1();
}
Run Code Online (Sandbox Code Playgroud)

当我在注册表中设置此值时,我不想为程序集A提供主可执行文件,但是即使我不使用该方法,它也需要程序集A来启动.我当然得到了这个,但有没有办法绕过这个?

Mar*_*ell 10

通常,当CLI正在JITting任何包含尚未加载的程序集中的类型的包含方法时,程序集加载和聚合会按需发生.所以:"修复"的方法是将涉及此程序集中类型的所有代码移动到永远不会执行的方法中.例如:

if( valueFromRegistryIsAlwaysFalse)
{
   DoStuff();
}

[System.Runtime.CompilerServices.MethodImpl(
    System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
void DoStuff()
{
   var A = new classA();
   A.method1();
}
Run Code Online (Sandbox Code Playgroud)

通过此更改,原始方法没有提及classA,因此可以在不需要额外组装的情况下进行JIT操作; 并且因为DoStuff它永远不会被执行/ JIT,所以它永远不会从那里加载.