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ß
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.
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 ;)
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 :-(
Ralf Jansen hat folgendes geschrieben : |
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.
Ralf Jansen hat folgendes geschrieben : |
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 :-)
Ralf Jansen hat folgendes geschrieben : |
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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!