Hallo,
ich versuche gerade eine DLL erst nach dem Programmstart einzubinden (für spätere Plugin Unterstützung).
Das ganze versuche ich nach diesem Schema zu bewerkstelligen:
public class C
{
private void m()
{
Assembly a= Assembly.LoadFrom(Application.StartupPath + "\\" + "DLL.dll");
Type t = a.GetType("NameSpace.Klasse");
object o = Activator.CreateAssembly(t);
C2 d = o as C2;
}
}
public abstract class C2
{
public abstract void m();
}
Das klappt bei parameterlosen Klassen wunderbar.
Jetzt möchte ich zwei Klassen der TouchlessLib.dll (=> Link) einbinden, und zwar TouchlessMgr und Camera.
TouchlessMgr klappt nach obigen Schema einwandfrei, da parameterlos.
Jetzt das Problem. Camera hat 2 Parameter Camera(object nativeInterface, string name).
Das ist mein Ansatz:
public class C
{
private void m()
{
Assembly a= Assembly.LoadFrom(Application.StartupPath + "\\" + "TouchlessLib.dll");
Type t = a.GetType("TouchlessLib.Camera");
object o = Activator.CreateAssembly(t, new object[] { typeof(object), typeof(string) }); //Fehler
Camera c = o as Camera;
}
}
public abstract class Camera
{
public abstract void set_CaptureWidth(int value);
public abstract void set_CaptureHeight(int value);
public abstract Bitmap GetCurrentImage();
}
Bei der kommentierten Zeile tritt der Fehler auf: "Der Konstruktor für den Typ TouchlessLib.Camera wurde nicht gefunden."
Hier noch ein Screenshot vom Reflector:
Bitte Dateien immer als Anhang anhängen!
Verushc doch einfach mal statt zwei TYPINSTANZEN die WERTE für den Construktor anzugeben. Was vermutlich passiert ist folgendes, du übergibst 2 dem Activator zwei Typinstanzen mit typeof(), dieser such dann nach einem passenden Constructor mit den Parametern Type,Type und das schlägt dann fehl.
Das habe ich auch schon probiert, leider mit dem gleichen Ergebnis (Konstruktor nicht gefunden).
object o = Activator.CreateInstance(t, new object[] { (object)"test", (string)"test" });
Wenn man sich den Screenshot anguckt, wird beim Aufrufen der Klasse noch nichts Konkretes mit den Parameter angestellt, deswegen kann es ja eigentlich nicht an den Werten an sich liegen, oder hab ich da was falsch verstanden?
Tja - da hilft ein Blick in die :rtfm: Doku weiter (auch wenn das allgemein wohl eine unübliche Vorgehensweise zu sein scheint...):
[QUOTE3=MSDN: Activator.CreateInstance(Type, object[]),http://msdn.microsoft.com/de-de/library/wcxyzt4d.aspx]MissingMethodException: No matching public constructor was found.
[...]
The constructor to be invoked must be accessible and must provide the most specific match with the specified argument list.[/quote3]
Insofern musst du wohl über ConstructorInfo gehen bzw. eine andere Klasse instanzieren.
Ok das klingt einleuchtend 😕
Ohne die Camera Klasse wird das wohl nichts (mein Hauptziel war die GetCurrentImage() Methode, die den aktuellen Frame der Webcam ausgibt), oder gibt es irgendwelche Tricks?
Hier mal die gesamte TouchlessMgr Klasse:
Was ist an "Bitte Dateien immer als Anhang anhängen!" so schwer zu verstehen. Bitte macht das ab jetzt selber. Ist ja kein Problem, die JPG-Datei auf unter 256KB zu komprimieren.
Hier mal die gesamte TouchlessMgr Klasse:
Warum willst du die unbedingt verwenden?
Bzw. warum verwendest du nicht direkt diesen TouchlessMgr (also dessen Properties)?
Google generell mal nach "Webcam C#" - ich bezweifle, dass du da nichts findest.