Используя С#, я создаю DLL во время выполнения, и теперь я хочу добавить его в качестве ссылки на мой проект во время выполнения.
Я попытался использовать метод LoadFrom
, но он не работает.
Как я могу это сделать?
Используя С#, я создаю DLL во время выполнения, и теперь я хочу добавить его в качестве ссылки на мой проект во время выполнения.
Я попытался использовать метод LoadFrom
, но он не работает.
Как я могу это сделать?
Сначала вы должны загрузить 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>
LoadFile vs. LoadFrom
Будьте осторожны - это не то же самое вещь.
LoadFrom() проходит через Fusion и может перенаправляться на другую другой путь, но с тем же идентичность, если она уже загружена контекст LoadFrom. LoadFile() не связывается через Fusion вообще - погрузчик просто идет вперед и загружается точно * то, что запросил вызывающий. Это не использует либо Load, либо LoadFrom контекст. Итак, LoadFrom() обычно дает вам то, о чем вы просили, но не обязательно. LoadFile() для те, кто действительно, действительно хотят точно что запрашивается. (* Однако, начиная в версии 2 политика будет применяться к обоим LoadFrom() и LoadFile(), поэтому LoadFile() не обязательно будет точно, что было запрошено. Также, начиная с v2, если сборка с его идентификация находится в ПКК, ПКК вместо этого будет использоваться копия. использование ReflectionOnlyLoadFrom() для загрузки точно, что вы хотите - но, обратите внимание, что сборок, загруженных таким образом, не может быть выполняется.)
LoadFile() имеет catch. С тех пор не использует контекст привязки, его зависимости не автоматически найденный в его каталоге. Если они не доступный в контексте загрузки, вы должны были бы подписаться на Событие AssemblyResolve для привязки к ним.
Используйте Assembly.LoadFile, а затем запустите код внутри, используя отражение.
На самом деле Assembly.Load
обычно то, что вы хотите, а не LoadFrom
, а не LoadFile
:
Какой контекст подходит именно вам? В вообще, я настоятельно рекомендую вам используйте контекст загрузки по возможности
http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx
Вы не можете добавить dll в проект, когда проект уже запущен. Однако вы можете загрузить dll с помощью Assembly.LoadFrom(имя файла). Обычно такой scenerio используется для SOA или проектов на основе плагинов. Вы можете использовать интерфейс, чтобы указать структуру типа и загрузить DLL и использовать его.
Вы можете использовать метод Assembly.LoadFrom для динамической загрузки сборки во время выполнения.
Это очень просто в .NET: http://msdn.microsoft.com/en-us/library/1009fa28.aspx