Laden...

DLL während Programm-Laufzeit einbinden, Problem.

Erstellt von arnibold vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.035 Views
a
arnibold Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren
DLL während Programm-Laufzeit einbinden, Problem.

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:

Hinweis von winSharp93 vor 11 Jahren

Bitte Dateien immer als Anhang anhängen!

u
400 Beiträge seit 2008
vor 11 Jahren

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.

a
arnibold Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren

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?

5.742 Beiträge seit 2007
vor 11 Jahren

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.

a
arnibold Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren

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:

Hinweis von herbivore vor 11 Jahren

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.

5.742 Beiträge seit 2007
vor 11 Jahren

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.