Autor |
Beitrag |
m.keller
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Mi 11.06.14 15:25
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ß
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 verwenden müssen (d.h. Funktionssignaturen mit dem DllImport-Attribut erstellen).
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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); |
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 12.06.14 09:57
Die DLL muß sich im Anwendungsverzeichnis befinden (oder aber in einem der Systempfade).
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Do 12.06.14 10:03
Sorry habe ich vergessen zu schreiben.
Dort befindet sich die Datei natürlich schon.
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 12.06.14 10:06
Hat die DLL noch andere DLLs als Abhängigkeiten? Du kannst mal den DependencyWalker dafür benutzen, um das rauszufinden.
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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?
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 12.06.14 10:54
selbe Antwort wie oben...
|
|
m.keller 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: 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(); |
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 12.06.14 17:34
Der VB long ist ein 64Bit Typ. Ist also eher schwer den auf einen Int32 zu mappen 
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 12.06.14 19:16
Habe ich auch erst gedacht, aber laut VB6: Datentypen ist es wohl doch nur 32bit.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Fr 13.06.14 07:39
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
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 
      
Beiträge: 133
Win xp, Win 7
C# (VS 2008)
|
Verfasst: Fr 13.06.14 10:47
Zitat: | Ja dann hat der Hersteller doch bestimmt eine umfassende Doku die alles erklärt  |
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.
_________________ Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
|
|