-
        

Ergebnis 1 bis 7 von 7

Thema: Problem mit Quasitreiber im Selbstbauversuch C# mit .NET

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380

    Problem mit Quasitreiber im Selbstbauversuch C# mit .NET

    Anzeige

    nachdem ich im Cplusplus-Forum leider vergleblich auf Antwort warte, hoffe ich hier vielleicht jemanden mit Erfahrung auf dem Gebiet anzutreffen

    Ich versuche gerade einen Quasi-Treiber als DLL zu schreiben, welchen ich dann später in Labview einbauen möchte, da ich mit Labview in der Beziehung auf Kriegsfuß stehe!

    Der Plan ist recht simpel aber Umständlich (Labview lernen wäre noch umständlicher) ...

    Eine DLL mit Interfacemethoden und einer Load-Methode, welche in Labview statisch eingebunden wird. Zur Laufzeit wird die eigentliche Treiber-DLL via Load-Methode nachgeladen und über die Interfacemethoden durch Vererbung auf den Treiber zugegriffen.

    Sieht nach ersten versuchen folgendermaßen aus:
    Code:
            TestDLL.DLLClass libraryobject = null; 
            Assembly DLLLink = null; 
            public bool loadDLL(string path) 
            { 
                try 
                { 
                    DLLLink = Assembly.LoadFrom(path); 
                    Type t = DLLLink.GetType("TestDLL.DLLClass"); 
                    libraryobject = (TestDLL.DLLClass)Activator.CreateInstance(t); //<---- hier steigt er aus 
                    return true; 
                } 
                catch (Exception e) 
                { 
                    textBox1.AppendText(e.Message+"\r\n"); 
                } 
                return false; 
            }
    produziert aber folgenden Fehler den ich nicht zu entschlüsseln vermag (auch leider in Google nichts nützliches entdeckt)

    TestDLL.dll
    [A]TestDLL.DLLClass kann nicht in [B]TestDLL.DLLClass umgewandelt werden. Der Typ "A" stammt von "TestDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" im Kontext "LoadFrom" am Speicherort "TestDLL.dll".. Der Typ "B" stammt von "TestDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" im Kontext "Default" am Speicherort "TestDLL.dll"..
    falls jemand eine Idee hat wie genau man den Fehler zumindest interpretieren kann oder einen nützlichen Link findet, her damit ich bin Dankbar für alles!

    Die Objekte unterscheiden sich ja nur im "Kontext" wie ich den aber manipulieren kann oder wie ich es richtig mache sag einem aber leider keiner. Mein Code ist aus Beispielen im Netz abgeleitet um DLLs dynamisch nachzuladen!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Kann bei C# nicht viel sagen, aber wenn eine DLL nicht passt, geht es meistens um den "call"-Standard.

    Bei C++ muss ich sowas definieren
    Code:
    class RNREGIST_API CRnRegist {
    public:
     CRnRegist(void);
    };
    
    extern "C" RNREGIST_API int fnRnRegist(void);
    damit die DLL allgemein verwendbar ist ( also für Visial Basic oder sonstwas)

    VIelleicht gilt das auch für labview
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    den gibts in c# nicht mehr, .net nimmt mir freundlicherweise die ganzen entrypointdefinitionen ab!

    Das Problem tritt interessanterweise nur dann auf, wenn ich eine DLL versuche doppelt zu laden ... ich habe bis jetzt keine Idee wie ich genau das verhindern kann!

    Wenn ich die abgeleitete DLL direkt lade funktioniert der cast wunderbar, wenn ich dann aber irgendwann einmal die Basis DLL doppelt geladen habe(verklickt oder eben provoziert), kann er nichtmehr casten!

    Der Fehler basiert allerdings auf dem Fehler im ersten Post, sobald ich 2 mal die Basis-DLL geladen habe kann er nichtmehr auf die Basisklasse runtercasten!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    okay, sry für doppelpost aber ich habs gelöst ^^

    ich musste zwar komplett über die reflections-API gehen, was mir einige scherereien besorgt hat, aber da ich das alles nur in der Basisklasse einmal tippen muss iss mir das Sch***egal (selbstzensiert) ^^

    Ich erkläre nur eben den Weg, den Code zu posten wäre vll. etwas krass ^^ aber wenn Bedarf besteht einfach melden, ich heb sowas ewig auf ^^

    Ich rufe in Labview die DLL auf,
    erzeuge mir ein Objekt der Basisklasse,
    rufe die load-Methode auf,
    übergeb ihr den Pfad zur abgeleiteten DLL,
    Suche im Verzeichnis der abgeleiteten DLL nach der Basis-DLL (um sie über Reflections zu öffnen),
    prüfe ob die DLL bereits geladen wurde und hole sie ggf. aus dem cache ODER
    öffne dann die abgeleitete DLL über Reflections, prüfe ob es die Basis-DLL ist und weise sie ggf. ab, ODER lade die neue DLL in den cache
    dann caste ich sie noch auf die Basisklasse herunter (klappt jetzt, weil ich die base-dll nur über reflection lade)

    über die anfangs angelegte basis-Instanz kann ich dann über die public Methoden indirekt auf die abgeleiteten Funktionen zugreifen!
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Bei solchen C# spezifischen Fragen lohnt sich immer ein Blick auf www.mycsharp.de .Ich denke mal dass man dir dort eher weiter helfen kann als hier.
    Ich könnte mir vorstellen, dass wenn du die Dll zwei mal geladen hast, dass die Reflection Probleme hat verschiedene Verweise aufzulösen, da nun [A] und [B] zur Verfügung stehen in denen allerdings die gleichen Klassen usw. definiert sind.

    EDIT: Gut wenn dus selber gelöst hast. Ich hätte noch interesse am Code

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    schick ich dir morgen wenn ich wieder am rechner sitze flüster mir mal ne mail, weil das relativ viel text iss hier als code
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Häng es doch einfach als Txt oder als .cs datei in den Anhang. Ich werd dir trotzdem mal meine Mail per PN schicken

Ähnliche Themen

  1. Seismograph Selbstbauversuch
    Von v-robot im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 10.09.2011, 15:03
  2. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 19:45
  3. Problem mit Atmega644P Erkennung (Bascom-Versions-Problem)
    Von Rohbotiker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.08.2008, 19:52

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •