2010-04-16 4 views
6

Я пытаюсь просто загрузить DLL, написанную на C# во время выполнения, и создать экземпляр класса в этой DLL.Динамическая загрузка DLL

Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll"); 
Type type = a.GetType("FileReleaseHandler", true); 
TestInterface.INeeedHelp handler = Activator.CreateInstance(type) as TestInterface.INeeedHelp; 

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

Что мне здесь не хватает? или даже есть лучший способ, которым я должен заниматься этим?

ответ

4

Где находится TestInterface.INeedHelp? Одна из распространенных проблем заключается в том, что у вас один и тот же интерфейс в нескольких сборках. Если оба вызывающего и динамически загруженные сборки ссылаются на один и тот же интерфейс в одной и той же сборке, все должно быть в порядке.

Одна тонкость в том, что если сборка находится в другой директории к сборке вызывающего, это может в конечном итоге загрузки другой экземпляр той же сборки, что может быть очень раздражает :(

+0

Это была проблема. У меня был интерфейс, определенный в каждом проекте (один с динамически загружаемой dll и один с вызывающим .exe) Тот же точный код, но 2 места diff. Как только я вырвал интерфейс и имел оба вызывающего .exe и динамически загружаемую ссылку на DLL на тот же интерфейс, он работал нормально. Спасибо, Джон. Это была большая помощь. – etoisarobot

4

Попробуйте установить объект Activator.CreateInstance прямому объекту и не выполнять литье.

Возможно FileReleaseHandler не реализует TestInterface.INeeedHelp, и в этом случае он будет установлен в значение null через «как TestInterface.INeeedHelp».

+0

Действительно. Моя первая мысль состояла в том, чтобы проверить, что 'Activator.CreateInstance (type)' возвращает * что-то *. Затем выясните, что это должно быть. – ChrisF

1

Проверьте сборки, которые загружены в домен приложения. Существуют ли две сборки с интерфейсом TestInterface.INeedHelp? Мое подозрение в том, что LoadFrom связывает этот созданный объект с другим TestInterface.INeedHelp, чем тот, который вы пытаетесь выполнить. Попробуйте сделать обычную подавленную, а не так называемую «безопасную» акцию и посмотреть, какую ошибку вы получите.

0

Проблема заключается в том, что Метод LoadFrom загружает dll в контекст «LoadFrom», который отличается от контекста по умолчанию. Правила разрешения типов для типов в этом контексте отличаются от тех, к которым вы привыкли. Возможно, интерфейс INeedHelp, определенный в вашей основной модуль с точки зрения времени выполнения отличается от интерфейса с тем же именем, что и в контексте LoadFrom. Это приведет к тому, что литой (как TestINterface) возвращается значение null.

Чтобы проверить, если это так, попробуйте присвоить результат объекту.

0

Я хотел бы сделать что-то вроде:

Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll"); 
object obj = a.CreateInstance("fullClassName",other params) as IMyType 
//(if it implements an interface you referenced) 
Смежные вопросы