Загрузка сборки только один раз - PullRequest
2 голосов
/ 22 декабря 2010

Предположим, я много раз вызываю Assembly.LoadFile с именем DLL. Загружается ли он столько же раз, сколько вызов метода 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 ]

1 голос
/ 22 декабря 2010

Вот ссылка на документацию: http://msdn.microsoft.com/en-us/library/b61s44e8.aspx

Обратите внимание на то, что говорится в комментариях:

LoadFile полезен в этом ограниченном сценарии, потому что LoadFrom нельзя использовать для загрузки сборок, которые имеют одинаковые идентификаторы, но разные пути; он загрузит только первую такую ​​сборку.

Что я убрал, так это то, что если путь будет другим, он будет загружать сборку для каждого вызова. Но если путь тот же, то не будет.

Но, как сказал @unholysampler, вы можете легко проверить это, чтобы подтвердить.

0 голосов
/ 22 декабря 2010

Документация для 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...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...