Entwickler-Ecke

Sonstiges (.NET) - Probleme bei einer .dll in c# Service einfügen


m.keller - Mi 11.06.14 15:25
Titel: Probleme bei einer .dll in c# Service einfügen
Hallo allerseits,

Neues Projekt neues Glück ;-)
Viel mehr Pech...

Ich habe eine .dll die ich in eine c# Projekt eingliedern muss.
zusätzlich habe ich ein Projektbeispiel in VB6 bekommen und kenne die Funktionen.

leider kann ich die .dll nicht in den Verweisen hinzufügen.
"Es konnte kein Verweis aus ... .dll hinzugefügt werden. Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass sie ein gültigen Assemblx oder COM-Komponente ist."

Wie kann ich diese trotzdem in C# verwenden?


Danke euch schon mal
Gruß


Th69 - Mi 11.06.14 15:33

Hallo,

dann wird es sich wohl um eine native DLL handeln (VB6 != VB.NET), und du wirst P/Invoke [http://en.wikipedia.org/wiki/Platform/Invoke] verwenden müssen (d.h. Funktionssignaturen mit dem DllImport-Attribut erstellen).


m.keller - Do 12.06.14 09:13

Hallo,

vielen dank.
Mit p/Invoke habe ich bis jetzt noch nicht gearbeitet.
Ich habe mir das gerade mal angesehen und ausprobiert.
Leider bekomme ich eine Fehlermeldung.

Ein Ausnahmefehler des Typs "System.DllNotFoundException" ist in WindowsFormsApplication1.exe aufgetreten.

Meine derzeitige Code versuch

C#-Quelltext
1:
2:
[DllImport("WlcCli.dll", CharSet = CharSet.Unicode)]
        public static extern int ReadBOOL(int DBNummer, int ByteOffset, int BitOffset, int pValue);


Th69 - Do 12.06.14 09:57

Die DLL muß sich im Anwendungsverzeichnis befinden (oder aber in einem der Systempfade).


m.keller - Do 12.06.14 10:03

Sorry habe ich vergessen zu schreiben.
Dort befindet sich die Datei natürlich schon.


Th69 - Do 12.06.14 10:06

Hat die DLL noch andere DLLs als Abhängigkeiten? Du kannst mal den DependencyWalker [http://www.dependencywalker.com/] dafür benutzen, um das rauszufinden.


m.keller - Do 12.06.14 10:16

ja hat sie leider, habe das gerade selber noch getestet.

Die .dll habe ich auch schon mir besorgt.
Nun stellt sich die frage wo muss diese liegen?


Th69 - Do 12.06.14 10:54

selbe Antwort wie oben...


m.keller - Do 12.06.14 15:24

Jetzt hat mir der Hersteller der .dll ein Dummy geschickt.

nur bekomme ich eine neue Meldung.

Ein Ausnahmefehler des Typs "System.AccessViolationException" ist in WindowsFormsApplication1.exe aufgetreten.

Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

kann es sein das irgendwie meine Typen nicht zusammen passen?

Hier das alte aus VB6

Quelltext
1:
      Declare Function InitAccessDB Lib "Wlccli.dll" () As Long                    


Mein C#

C#-Quelltext
1:
2:
[DllImport("WlcCli.dll")]
        public static extern Int32 InitAccessDB();


Ralf Jansen - Do 12.06.14 17:34

Der VB long ist ein 64Bit Typ. Ist also eher schwer den auf einen Int32 zu mappen ;)


Th69 - Do 12.06.14 19:16

Habe ich auch erst gedacht, aber laut VB6: Datentypen [http://de.wikibooks.org/wiki/Visual_Basic_6:_Variablen#Datentypen] ist es wohl doch nur 32bit.


Ralf Jansen - Do 12.06.14 20:35

Ok. Dann raten wir mal weiter.

a.) Du kompilierst deine C# Anwendung so das am Ende ein 64bit Prozess rauskommt du versucht aber eine 32Bit dll aufzurufen. Sollte aber eigentlich eine andere Fehlermeldung liefern
b.) aus InitAccessDB kommt ein Handle raus. Denn sollte der Returntyp als IntPtr definiert werden. Der abstrahiert die Pointergröße auf 4 oder 8Byte je nach Prozessbittigkeit. Da deine Dll ja ganz offensichtlich eine 32bit dll ist sollte da aber auch immer nur 4Byte rauskommen und wunderbar in einen Int32 passen. Ansonsten währst du auch schon über a.) gefallen.
c.) Die dll ist broken by design und funktioniert nur eher zufällig in classic VB und in .Net dann gar nicht.


m.keller - Fr 13.06.14 07:39

danke schon mal...

das bringt mich nicht viel weiter :-(

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Ok. Dann raten wir mal weiter.

a.) Du kompilierst deine C# Anwendung so das am Ende ein 64bit Prozess rauskommt du versucht aber eine 32Bit dll aufzurufen. Sollte aber eigentlich eine andere Fehlermeldung liefern


Der Prozess wird definitiv in 32bit kompiliert.

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
b.) aus InitAccessDB kommt ein Handle raus. Denn sollte der Returntyp als IntPtr definiert werden. Der abstrahiert die Pointergröße auf 4 oder 8Byte je nach Prozessbittigkeit. Da deine Dll ja ganz offensichtlich eine 32bit dll ist sollte da aber auch immer nur 4Byte rauskommen und wunderbar in einen Int32 passen. Ansonsten währst du auch schon über a.) gefallen.


Habe ich mit IntPrt versucht, aber wie du schon schreibst 4Byte sollte in Int32 passen :-)

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
c.) Die dll ist broken by design und funktioniert nur eher zufällig in classic VB und in .Net dann gar nicht.


Kann ich mir leider nicht vorstellen, die ist von einem Namen haften Hersteller und dieser vermarktet die dll


Ralf Jansen - Fr 13.06.14 10:03

Zitat:
die ist von einem Namen haften Hersteller


Ja dann hat der Hersteller doch bestimmt eine umfassende Doku die alles erklärt :roll:

Aus dem Namen InitIrgendwas der Methode und dem Fehlen von Parametern derjenigen leite ich mal ab das es irgendwelche Infrastruktur Probleme sind und keine eigentlichen Programmiertechnischen.

d.) Probier mal einen anderen Projekttyp. Wenn du bisher mit einer Konsolenanwendung getestet hast nimm mal was das auch eine Messageschleife startet (z.B. eine Winforms Anwendung). Wenn deine Dll zum Beispiel was aus der IPC Ecke macht oder ähnliches braucht die die vielleicht.
e.) Da deine Abhängigkeit eigene Abhängigkeiten hat mal prüfen ob es einen Versionsmischmasch gibt. Wenn du eine funktionierende VB Beispielanwendung hast einfach mal mit dem Debugger dranhängen und nachschauen welche Abhängigkeiten tatsächlich geladen wurden und woher und dann querprüfen ob deine VB.Net Anwendung denn die gleichen versucht zu verwenden.


m.keller - Fr 13.06.14 10:47

Zitat:
Ja dann hat der Hersteller doch bestimmt eine umfassende Doku die alles erklärt :roll:


Leider nein :-(

Ich suche mir das eher aus dem VB Scripte zusammen.

Zitat:
d.) Probier mal einen anderen Projekttyp. Wenn du bisher mit einer Konsolenanwendung getestet hast nimm mal was das auch eine Messageschleife startet (z.B. eine Winforms Anwendung). Wenn deine Dll zum Beispiel was aus der IPC Ecke macht oder ähnliches braucht die die vielleicht.


Ich bin mittlerweile umgeschwenkt zu WinForm damit ich wenigsten irgendwann etwas funktionierendes habe.
Leider gibt er nur im VS die Meldung aus.

Zitat:
e.) Da deine Abhängigkeit eigene Abhängigkeiten hat mal prüfen ob es einen Versionsmischmasch gibt. Wenn du eine funktionierende VB Beispielanwendung hast einfach mal mit dem Debugger dranhängen und nachschauen welche Abhängigkeiten tatsächlich geladen wurden und woher und dann querprüfen ob deine VB.Net Anwendung denn die gleichen versucht zu verwenden.


Das VB Beispiel ist schon compiliert :-(
Ich kann mir nur die ein oder anderen Dateien angucken.
Ich selber habe keine VB.Net sonder c#.Net

Hier etwas aus der .h Datei.

Quelltext
1:
DWORD WINAPI    InitAccessDB        (void);                    


so langsam blicke ich da nicht mehr durch.