2009-07-06 2 views
25

Я совершенно новый для загрузки в таких библиотеках, но вот где я стою:Загрузите файл .DLL и методы доступа из класса внутри?

У меня есть домашний DLL-файл, который примерно так же прост, как и сам класс и метод. В домашней программе, которая загружает эту библиотеку, у меня есть:

Assembly testDLL = Assembly.LoadFile("C:\\dll\\test.dll"); 

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

Что мне делать? Как именно я загружаю в него методы класса &?

Спасибо.

+0

есть ли конкретная причина, по которой вам нужно использовать отражение для динамической загрузки этой DLL? если нет, то используйте ответ Lunchy. –

ответ

32

Используйте Assembly.GetTypes(), чтобы получить коллекцию всех типов, или Assembly.GetType(name), чтобы получить конкретное описание.

Затем вы можете создать экземпляр типа с помощью конструктора без параметров, используя Activator.CreateInstance(type) или получить конструкторы с использованием Type.GetConstructors и вызвать их для создания экземпляров.

Аналогично вы можете получить методы с Type.GetMethods() и т.д.

В принципе, как только у вас есть тип Есть множество вещей, которые вы можете сделать, - посмотреть на member list для получения дополнительной информации. Если вы застряли, пытаясь выполнить определенную задачу (дженерики могут быть сложными), просто задайте конкретный вопрос, и я уверен, что мы сможем помочь.

3

Если вы хотите динамически загрузить сборку, а затем вызвать методы из классов в ней, вам нужно выполнить какую-либо форму динамического вызова.

Проверьте, пожалуйста, here.

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

foreach (Type t in assemblyToScan.GetTypes()) 
     { 
      if(condition) 
       //do stuff 
     } 

И если вы просто хотите использовать сборку статически (при наличии сборки доступны в время компиляции), то ответ fom Launcy здесь, на этой странице, - это путь.

11

Так вы можете получить классы, если знаете тип.

Assembly assembly = Assembly.LoadFrom("C:\\dll\\test.dll"); 

// Load the object 
string fullTypeName = "MyNamespace.YourType"; 

YourType myType = assembly.CreateInstance(fullTypeName); 

Полное имя типа важно. Поскольку вы не добавляете .dll, вы не можете использовать «Использование», потому что это не в вашем проекте.

Если вы хотите, чтобы все, что я хотел, просто ответил Джон Скит.

+1

Жаль, если я выкопаю этот ответ из могилы. Мне было интересно, возможно ли получить доступ к интерфейсам таким же образом. То есть, если dll содержит «MyNamespace.MyInterface», как мне добраться до него? Например, в вашем примере «YourType» известен загрузчику dll. Что, если это не так, но я знаю это и его методы по имени, т. Е. Потому что они где-то документированы? – manu3d

+0

@ manu3d Да, вы можете. Работает аналогично, просто замените свой тип интерфейсом. –