Mam taką klasę:
public class MathClass
{
public MathClass()
{
a = 0;
b = 0;
}
private int a;
private int b;
public int A
{
get { return a; }
set { a = value; }
}
public int B
{
get { return b; }
set { b = value; }
}
public int Sum()
{
return a + b;
}
public int Difference()
{
return a - b;
}
}
Zbudowałem sobie plik dll z tą klasą i teraz chciałbym tej klasy używać w drugim programie. Założenie jest jednak takie, że z góry nie będę wiedział jakie dllki (pluginy) znajdą się w folderze z programem docelowym i w zależności od tego, mój program ma tworzyć odpowiednie obiekty i działać na nich. Na razie mam coś takiego:
static void Main(string[] args)
{
DirectoryInfo di = new DirectoryInfo("DLL\\"); //folder z dllkami
FileInfo[] dllFiles = di.GetFiles("*.dll"); //łapiemy wszystkie ewentualne dllki w folderze
Assembly assembly;
Object ob;
FileInfo fi = dllFiles[0]; //bierzemy pierwszą dllkę
Console.WriteLine(fi.Name);
assembly = Assembly.LoadFrom(fi.FullName); //ładujemy assembly
Type mathType = assembly.GetTypes()[0]; //łapiemy pierwszy typ z assembly
Console.WriteLine(mathType.Name);
ob = Activator.CreateInstance(mathType); //tworzymy obiekt złapanego typu
MethodInfo mi = mathType.GetMethod("Sum"); //łapiemy metodę Sum
Console.WriteLine(mi.Name);
Object result = mi.Invoke(ob, null); //wywołujemy metodę Su,
Console.WriteLine(result.ToString());
PropertyInfo piA = mathType.GetProperty("A"); //łapiemy properties
PropertyInfo piB = mathType.GetProperty("B");
Console.WriteLine(piA.Name + " " + piB.Name);
piA.SetValue(ob, 2, null); //ustawiamy properties
piB.SetValue(ob, 3, null);
result = mi.Invoke(ob, null); //jeszcze raz wywołujemy metodę Sum
Console.WriteLine(result.ToString()); //i widzimy, że wynik się zmienił ;)
Console.ReadKey();
}
To wszystko działa. Ale moje pytanie dotyczy tego, czy da się to rozwiązać w jakiś lepszy sposób? Na przykład czy byłaby możliwość uzyskania obiektu MathClass i działania na nim, jak na obiekcie z biblioteki statycznie dodanej poprzez references (np. mathObject.Sum() )?