Ищу сборку .NET в другом месте [дублировать

StackOverflow https://stackoverflow.com/questions/1561806

  •  21-09-2019
  •  | 
  •  

Вопрос

Этот вопрос уже имеет ответ здесь:

Как я могу сказать своему приложению .NET, где искать определенную сборку, которая ему нужна (кроме GAC или папки, откуда откуда работает приложение)? Например, я хотел бы поместить сборку в папку пользователя и дать моему приложению, что ссылочная сборка находится в папке Temp.

Спасибо

Это было полезно?

Решение

Вы можете использовать Appdomain.assemblysolve Событие, чтобы добавить пользовательские резолюры сборки. Это позволяет вам указывать на другие каталоги или даже базы данных, чтобы получить сборки по мере необходимости.

Я даже использовал аналогичный код, чтобы загрузить сборки из базы данных и хранить в изолированном Старию. Имя файла как хэш полного имени сборки. Тогда база данных должна была бы загрузить только в первый раз, когда вы решите, и все будущие разрешения будут обслуживаться файловой системой. Лучше всего о событии Absterblyresolve - это вы можете использовать его type.gettype () и встроенные сериалы.

static string lookupPath = @"c:\otherbin";

static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += 
        new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static Assembly CurrentDomain_AssemblyResolve(object sender, 
                                              ResolveEventArgs args)
{
    var assemblyname = new AssemblyName(args.Name).Name;
    var assemblyFileName = Path.Combine(lookupPath, assemblyname + ".dll");
    var assembly = Assembly.LoadFrom(assemblyFileName);
    return assembly;
}

Другие советы

Смотрите это обсуждение для некоторых вопросов:

http://bytes.com/topic/c-sharp/answers/248203-dynamic-assembly-loading

По сути, вы не можете изменить приложение Appdomain после его создания. Вы должны указать его как часть конфигурации перед созданием новой, которая не поможет вам в Appdomain по умолчанию.

Если сборка, которую вы хотите загрузить, находится в каталоге под текущей Appbase, вы можете добавить его относительный путь, используя AppendPrivatePath (RelativePath), а затем использовать Assembly.load - Средство выполнения будет исследовать подканальные директора для вас. Это лучший/самый простой способ справиться с этим.

System.Reflection.Assembly.LoadFrom(myFile);

http://msdn.microsoft.com/en-us/library/1009fa28.aspx

Другая альтернатива - обработать сборочные события самостоятельно как в этом вопросе Stackoverflow: Как добавить папку в путь поиска сборки во время выполнения в .net?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top