Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 12.06.14 09:57 
Die DLL muß sich im Anwendungsverzeichnis befinden (oder aber in einem der Systempfade).
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 12.06.14 10:54 
selbe Antwort wie oben...
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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
ausblenden Quelltext
1:
      Declare Function InitAccessDB Lib "Wlccli.dll" () As Long					


Mein C#
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 12.06.14 17:34 
Der VB long ist ein 64Bit Typ. Ist also eher schwer den auf einen Int32 zu mappen ;)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 12.06.14 19:16 
Habe ich auch erst gedacht, aber laut VB6: Datentypen ist es wohl doch nur 32bit.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: 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.
ausblenden 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)