Вопрос по c#, dll – Загрузить файл .DLL и получить доступ к методам из класса?

26

Я совершенно новичок в загрузке в такие библиотеки, но вот где я стою:

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

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

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

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

Благодарю.

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

Ваш Ответ

3   ответа
12

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

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

YourType myType = assembly.CreateInstance(fullTypeName);

Полное имя типа важно. Поскольку вы не добавляете .dll, вы не можете использовать объект, поскольку его нет в вашем проекте.

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

@ manu3d Да, вы можете. Работает так же, просто замените ваш тип на интерфейс.
Извините, если я выкопаю ваш ответ из могилы. Мне было интересно, возможно ли получить доступ к интерфейсам таким же образом. То есть, если DLL содержит «MyNamespace.MyInterface», как мне к нему добраться? Т.е. в вашем примере "YourType" известен загрузчику dll. Что если это не так, но я знаю его и его методы по имени, то есть потому, что они где-то задокументированы?
33

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

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

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

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

3

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

ПроверьтеВот для базового совета по этому вопросу.

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

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

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

Похожие вопросы