Подтвердить что ты не робот

Добавить DLL программно во время выполнения

Используя С#, я создаю DLL во время выполнения, и теперь я хочу добавить его в качестве ссылки на мой проект во время выполнения.

Я попытался использовать метод LoadFrom, но он не работает.

Как я могу это сделать?

4b9b3361

Ответ 1

Сначала вы должны загрузить DLL

Assembly assembly = Assembly.LoadFrom("dllPath");

Затем вам может потребоваться добавить сборку в домен приложения

AppDomain.CurrentDomain.Load(assembly.GetName());

После этого вы можете загрузить любой тип из этой сборки

Type t = assembly.GetType("typeName");

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

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

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="dlls folder"/>
  </assemblyBinding>
</runtime>

Ответ 2

LoadFile vs. LoadFrom

Будьте осторожны - это не то же самое вещь.

LoadFrom() проходит через Fusion и может перенаправляться на другую другой путь, но с тем же идентичность, если она уже загружена контекст LoadFrom. LoadFile() не связывается через Fusion вообще - погрузчик просто идет вперед и загружается точно * то, что запросил вызывающий. Это не использует либо Load, либо LoadFrom контекст. Итак, LoadFrom() обычно дает вам то, о чем вы просили, но не обязательно. LoadFile() для те, кто действительно, действительно хотят точно что запрашивается. (* Однако, начиная в версии 2 политика будет применяться к обоим LoadFrom() и LoadFile(), поэтому LoadFile() не обязательно будет точно, что было запрошено. Также, начиная с v2, если сборка с его идентификация находится в ПКК, ПКК вместо этого будет использоваться копия. использование ReflectionOnlyLoadFrom() для загрузки точно, что вы хотите - но, обратите внимание, что сборок, загруженных таким образом, не может быть выполняется.)

LoadFile() имеет catch. С тех пор не использует контекст привязки, его зависимости не автоматически найденный в его каталоге. Если они не доступный в контексте загрузки, вы должны были бы подписаться на Событие AssemblyResolve для привязки к ним.

ref Заметки CLR для Suzanne Cook.NET

Ответ 3

Используйте Assembly.LoadFile, а затем запустите код внутри, используя отражение.

Ответ 5

Вы не можете добавить dll в проект, когда проект уже запущен. Однако вы можете загрузить dll с помощью Assembly.LoadFrom(имя файла). Обычно такой scenerio используется для SOA или проектов на основе плагинов. Вы можете использовать интерфейс, чтобы указать структуру типа и загрузить DLL и использовать его.

Ответ 6

Вы можете использовать метод Assembly.LoadFrom для динамической загрузки сборки во время выполнения.