ОБНОВЛЕНИЕ:
Технически неподдерживаемое, но работающее решение - это p / Invoke LoadLibrary и специально загрузить нужную DLL на ранней стадии процесса.Все управляемые и p / Invoke'd библиотеки загружаются «по мере необходимости».CLR загрузит их для вас, когда вы вызовете метод, который зависит от одного из типов в этой сборке (примечание: это «неподдерживаемая» часть; это не задокументировано и может измениться в будущем CLRверсия).
Этот подход работает, потому что, если сборка загружается через LoadLibrary
, она «обнаруживается» загрузчиком CLR и среда выполнения не будет пытаться загрузить ее снова.Мы использовали этот трюк на CF для предварительной загрузки сборок перед выполнением большого выделения памяти, чтобы избежать ситуаций нехватки памяти.
Итак, вы должны иметь возможность:
public static void Main()
{
LoadCorrectDLLs();
// .NET will ensure DotNetZip is loaded at this point.
MethodInThisAssembly();
}
public static void MethodInThisAssembly()
{
// Since MethodInThisAssembly uses DotNetZip,
// its assembly will get loaded immediately before this method is called.
IDotNetZipInterface x = null;
...
}
public static void LoadCorrectDLLs()
{
// p/Invoke LoadLibrary to load the correct version of DotNetZip.
}
Примечаниечто следующее не сработает:
public static void Main()
{
LoadCorrectDLLs();
// This line would force DotNetZip to get loaded before Main() is called
IDotNetZipInterface x = null;
}
Старый ответ;работает только для настольных систем:
Одна хитрость заключается в том, чтобы разместить их в каталогах, которые не будут найдены во время загрузки DLL (например, в разных подкаталогах каталога вашего исполняемого файла), и обработать AppDomain.AssemblyResove.У Дэвида Мортона есть приличная статья в его блоге .