仅装载一次装配

时间:2010-12-22 17:36:03

标签: c# reflection

假设我多次使用DLL的名称调用Assembly.LoadFile。它是否在调用LoadFile方法时加载了多少次,或者只在给定的进程/应用程序域中加载一次?

考虑一下:

    class Program
    {
        static void Main(string[] args)
        {
            DoSomething();
            DoSomeMoreStuff();

            // More of such method calls that each 
            // call Assembly.LoadFile()
        }

        static void DoSomething()
        {
            var asm = Assembly.LoadFile("SomeExternal.dll");

            // stuff happens...
        }

        static void DoSomeMoreStuff()
        {
            var asm = Assembly.LoadFile("SomeExternal.dll");

            // stuff happens...
        }
    }

如果它加载程序集的次数是多少次,有没有办法防止这种情况发生?

2 个答案:

答案 0 :(得分:1)

以下是文档的链接: http://msdn.microsoft.com/en-us/library/b61s44e8.aspx

请注意备注中的内容:

LoadFile在这种有限的场景中很有用,因为LoadFrom不能用于加载具有相同身份但路径不同的程序集;它只会加载第一个这样的组件。

我带走的是,如果路径不同,它将为每个呼叫加载程序集。但如果路径相同则不会。

但是像@unholysampler说的那样你可以很容易地测试这个以确认。

答案 1 :(得分:0)

LoadFile()的文档似乎没有说它是否多次导入,所以我会假设它确实如此,除非另有说明。好消息是,自己做这件事并不难。

class Program
{
  private static Assembly _asm;

  private static Assembly getExternalDll()
  {
    if (_asm == null)
      _asm = Assembly.LoadFile("SomeExternal.dll");
    return _asm;
  }

  static void Main(string[] args)
  {
    DoSomething();
    DoSomeMoreStuff();

    // More of such method calls that each 
    // call Assembly.LoadFile()
  }

  static void DoSomething()
  {
    var asm = getExternalDll();
    // stuff happens...
  }

  static void DoSomeMoreStuff()
  {
    var asm = getExternalDll();
    // stuff happens...
  }
}