2009-10-19 2 views
3

Я пытаюсь загрузить сборку без блокировки файла. Эти сборки могут быть сторонними сборками, поэтому мы не обязательно имеем доступ к коду, и один или два из них используют Assembly.Location для чтения файлов из своего каталога, на которые они могут зависеть.Assembly.Load (Byte []) и Assembly.Location/Assembly.Codebase

Я знаю, что вы можете сделать это через Shadow Copying, но это настоящая боль, чтобы заставить его работать правильно, и несколько пользователей на определенных форумах рекомендовали загрузить сборку в массив байтов и использовать Assembly.Load (Byte []) перегрузки. Это отлично работает, пока одна из этих сборок не попытается получить доступ к файлу в родительском каталоге, потому что Assembly.Location возвращает пустую строку, а Assembly.Codebase возвращает местоположение приложения, загружающего сборку.

Есть ли что-нибудь, что я могу сделать, чтобы каким-либо образом установить свойства Codebase или Location сборки, которые я загружаю? В документации MSDN для Codebase и Location они определены как переопределяемые свойства - означает ли это, что я могу переопределить их из приложения-хостинга?

+1

Возможно, теневое копирование будет лучшим решением ... – Restuta

+0

@Restuta, я согласен. –

ответ

1

Вы можете использовать AppDomainSetup.ApplicationBase? Или вам нужно определить этот путь для каждой загружаемой сборки?

EDIT: с помощью файла легко определить кодовую:

AssemblyName assemblyRef = new AssemblyName(); 
assemblyRef.CodeBase = assemblyFile; 
Assembly assembly = Assembly.Load(assemblyRef); 

Может быть, вы могли бы использовать AppDomain.AssemblyLoad или Assembly.ModuleResolve события, но я сомневаюсь.

+0

Каждая загруженная сборка будет загружена с другого пути, поэтому каждому из них потребуется другое местоположение или свойство кодовой базы. –

+0

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

+0

рассмотрим эту статью, которую я создал в CodeProject: http://www.codeproject.com/KB/WCF/generic_wcf_host.aspx; что консольный хост не блокирует ваши сборки –

0

использование ::

var assembly = Assembly.ReflectionOnlyLoad(System.IO.File.ReadAllBytes(yourFullfileNamePath));

Но вы все равно должны сделать это в другом AppDomain.

 Смежные вопросы

  • Нет связанных вопросов^_^