Правильный способ принудительной загрузки сборки в текущий домен

У меня есть проект, который использует несколько библиотек классов, которые являются частью моего проекта, сначала загружается AssemblyA, затем загружается AssemblyB. В AssemblyA есть код, который выполняет следующие

var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var assemblyB = assemblies
                .Where(x=>x.GetName() == "AssemblyB")
                .First();
var type = assemblyB.GetType("AssemblyB_Type");

К сожалению, когда AssemblyA пытается это сделать, AssemblyB еще не загружен в CurrentDomain, поэтому для загрузки этой сборки я делаю следующее ненужное:

var x = typeof(AssemblyB.AssemblyB_Type);

Компилятор показывает предупреждение о том, что эта строка не нужна, хотя я не могу найти слова, чтобы объяснить, что в противном случае это не сработает, так что вопрос будет, как вы правильно (в терминах фэн-шуй) загрузите в CurrentDomain, не делая особо неудобную сантехнику

Ответ 1

Ваш существующий код - лучший способ сделать это (AFAIK).

Чтобы избавиться от предупреждения, измените его на

typeof(AssemblyB.AssemblyB_Type).ToString();

Ответ 2

Если ваши ссылочные сборки развернуты правильно, они должны "просто загрузить", если вы вызываете один из его типов. Рамка .NET должна позаботиться об этом для вас.

Вот хорошая статья, объясняющая, как структура ищет ваши ссылочные сборки: http://msdn.microsoft.com/en-us/library/yx7xezcf(v=vs.71).aspx

Мне любопытно, что вы делаете, что вам нужно преждевременно загружать сборку?

Взлом для ответа на ваш прямой вопрос - использовать Assembly.Load(расположение строки) - хотя я бы отговорил это, если это абсолютно необходимо. http://msdn.microsoft.com/en-us/library/ky3942xh.aspx

Ответ 3

Итак, вы можете просто загрузить все сборки в каталог bin в домен приложения. Это должно решить вашу проблему.

var assemblies = Directory.GetFiles(containingDirectory, "*.dll")'

foreach (var assembly in assemblies)
{
    Assembly.Load(AssemblyName.GetAssemblyName(assembly));
}

Ответ 4

Это то, что я делаю:

public static class TypeExtensions {
   public static void EnsureAssemblyLoads(this Type pType) {
      // do nothing
   }
}

...

typeof(SomeType).EnsureAssemblyLoads();