Grüße! Ich habe (ein bisschen) mit C# und seinen Baugruppen herumalbern. Und so habe ich eine so interessante Funktion gefunden wie dynamische Lade-Assemblies und das Aufrufen der Klassenmitglieder. Ein wenig von Google und hier bin ich, schreibe eine Art "Assembly Explorer". (Ich habe einige Teile des Codes von here, here und here verwendet und keiner von ihnen gab irgendwelche der erwarteten Ergebnisse).C# 'konnte nicht gefunden werden' bestehende Methode
Aber ich habe einen kleinen Fehler gefunden: als ich versuchte, Klassenmethode von Assembly aufzurufen habe ich geladen, Anwendung ausgelöst MissingMethod Ausnahme. Ich bin sicher, dass DLL i Laden bin enthält Klassen und Methoden i bin tryin' aufzurufen (meine App sorgt für mich als auch RedGate .NET Reflector):
Der Hauptanwendungscode scheint um in Ordnung zu sein und ich fange an zu denken, wenn ich mit meiner DLL falsch war ... Ah, und ich habe beide Projekte in eine Lösung gebracht, aber ich denke nicht, dass es irgendwelche Probleme verursachen kann. Und ja, DLL-Projekt hat 'Klassenbibliothek' als Ziel, während die Hauptanwendung 'Konsolenanwendungsziel' hat.
Also, die Frage ist: Was ist los mit ihnen?
Hier sind einige Quellcode:
DLL Quelle:
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!");
}
}
}
Hauptanwendung Quelle:
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: für einen Fall gearbeitet - wenn DLL Methode braucht keine Argumente:
DLL-Klasse (funktioniert auch, wenn Methode ist nicht statisch):
public class Class1
{
public static void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
Methode invoke Code:
object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, null);
Würde mich überprüfen: Sie können auf ein Objekt eine statische Methode über invoke nennen? –
Werfen Sie einen Blick auf die Kommentare unten - es gibt keine Unterschiede mit oder ohne 'statische', Argumente oder was auch immer. – shybovycha