Привет!Я (немного) дурачился с C # и его сборками.И вот я обнаружил такую интересную особенность, как динамическая загрузка сборок и вызов членов этого класса.Немного о гугле, и вот я здесь, пишу что-то вроде "проводника сборок".(Я использовал некоторые части кода из здесь , здесь и здесь , и никто из них не дал ожидаемых результатов).
Но я обнаружил небольшую ошибку: когда я пытался вызвать метод класса из сборки, которую я загрузил, приложение вызвало исключение MissingMethod.Я уверен, что DLL, которую я загружаю, содержит класс и метод, который я пытаюсь вызвать (мое приложение обеспечивает мне, а также .NET Reflector RedGate ):
Основной код приложения, кажется, в порядке, и я начинаю думать, если я ошибся с моей DLL ... Ах, и я поместил оба проекта в одно решение, но я не думаю, что это может привести клюбые проблемы.И да, у проекта DLL есть цель «библиотека классов», в то время как у основного приложения есть цель «консольное приложение».
Итак, вопрос: что не так с em?
Вот некоторый исходный код:
Источник DLL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Class1
{
public void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
}
Основной источник приложения:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFrom(@"a\long\long\path\ClassLibrary1.dll");
try
{
foreach (Type t in asm.GetTypes())
{
if (t.IsClass == true && t.FullName.EndsWith(".Class1"))
{
object obj = Activator.CreateInstance(t);
object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); // Exception is risen from here
}
}
}
catch (Exception e)
{
System.Console.WriteLine("Error: {0}", e.Message);
}
System.Console.ReadKey();
}
}
}
UPD: работал для одного случая - когда метод DLL не принимает аргументов:
Класс DLL (также работает, если метод не является статическим):
public class Class1
{
public static void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
Код вызова метода:
object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, null);