Ищу .NET Assembly в другом месте

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

Спасибо


person G-Man    schedule 13.10.2009    source источник


Ответы (3)


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

Я даже использовал аналогичный код для загрузки сборок из базы данных и хранения в IsolatedStorage. Имя файла в виде хеша от полного имени сборки. Тогда базу данных нужно будет загрузить только при первом разрешении, и все будущие разрешения будут обслуживаться файловой системой. Лучшее в событии AssemblyResolve - это то, что вы можете использовать его 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;
}
person Matthew Whited    schedule 13.10.2009
comment
Как упоминалось здесь, используйте string assemblyname = new AssemblyName(args.Name).Name; вместо Split(','). - person kroimon; 04.04.2013
comment
Спасибо за предложение. - person Matthew Whited; 04.04.2013

См. Это обсуждение, чтобы узнать о некоторых из затронутых вопросов:

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

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

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

person Robert Harvey    schedule 13.10.2009
comment
Спасибо, просто в качестве примечания, мне не нужно загружать его динамически. Я ссылаюсь на сборку в моем проекте. Но когда я развертываю это приложение, я хочу, чтобы приложение знало, что указанная сборка будет во временной папке. - person G-Man; 13.10.2009

System.Reflection.Assembly.LoadFrom(myFile);

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

Другой альтернативой является обработка событий разрешения сборки самостоятельно, как в этом вопросе StackOverflow: Как добавить папку в путь поиска сборки во время выполнения в .NET?

person noctonura    schedule 13.10.2009