DLL in C Sharp einbinden System.DllNotFoundException

yukini

Grünschnabel
Hallo,

meine Daten:
Windows 7
VS 2008 (Standard Edition)
C # .NET, 3.5

Ich habe versucht eine DLL einzubinden die ca. 1999 erstellt worden ist.
Das alte Projekt wurde in VB 4 erstellt. Ich weiß leider nicht, ob die Anwendung noch auf dem Server läuft/lief.

Meine Aufgabe ist die DLL einzubinden und mit Ihrer Login-Funktion mich mit einem bestimmten System zu verbinden. Dies habe ich mit .NET C# realisiert.

Code:
public class C_Test
    {
       [DllImport("MyDll.DLL")]
       public static extern int LoginAuth(String Digest);

       static void test()
        {
            C_Test.LoginAuth("1234");
        }
    }

Die Dll ist im gleichen Verzeichnis wie die EXE abgelegt (bin\debug\).

Problem:


  1. System.DllNotFoundException

Was ich seltsam finde ist, dass auf meinem 32-Bit-Betriebssystem immer die Fehlermeldung
System.DllNotFoundException ausgegeben wird. Zum Test habe ich das Projekt kopiert und meinem Arbeitskollegen zugesendet. Er hat ein 64-Bit-Betriebssystem und bei ihm ist die Exception nicht ausgeworfen worden, sondern diese: System.BadImageFormatException.

Ich habe das Projekt an drei 64-Bit-Betriebssystem Rechnern getestet, wo die DLL gefunden wurde, aber dafür System.BadImageFormatException ausgegeben. Dazu an 2 Rechnern mit einem 32-Bit-Betriebssystem, wo die Meldung System.DllNotFoundException ausgegeben wurde. Daher bin ich davon ausgegangen, dass es am Betriebssystem liegt.

Kann das denn wirklich richtig sein oder ist die System.DllNotFoundException eine andere Ursache?

Ich habe viele Foren, wegen der Fehlermeldung System.DllNotFoundException, durchsucht, aber nichts davon hat weiter geholfen. Immer wurde auf den Pfad „bin\debug\“ hingewiesen.


  1. System.BadImageFormatException(es reicht mir fürs erste, wenn Ihr zu Punkt 1 helfen könnt)

Diese Exception habe ich natürlich auch nachgesehen und unter msdn stand, dass DLL und EXE im gleichen Format vorliegen müssen.

„anycpu.exe -- runs as a 32-bit process, can load anycpu.dll and x86.dll, will get BadImageFormatException if it tries to load x64.dll”

Dies habe ich geprüft. MyDll.DLL ist x86 und die EXE ist auch x86.

Dann gab es den Hinweis, dass die DLL auch andere DLLs aufrufen kann und dass die sich unterscheiden können, aber alle sind x86.
Was ich als einziges Problem sehen kann ist, dass die STD_MT.DLL nicht gefunden wird (mit Dependency Walker getestet). Ich versuche gerade den Ansprechpartner zu kontaktieren, da es sich meiner Meinung nach nicht um einen System DLL handeln kann.

Ich danke im Voraus.

Gruß
 
1. Du könntest mal schauen ob die die VB DLL direkt als Verweis setzen kannst.
(Müsste dann eine interop dll rauskommen)

2. Mit x86 bei der Exe sollte es laufen. Meistens setzte ich es nur dort und lass bei den dlls weiterhin Any.
Wo hast du x86 gesetzt, im ConfigurationsManager oder in den Projekteigenschaften?
Ich setzt es immer in den Projekteigenschaften.
 
Ich bedanke mich für deine Antwort.

1. Du könntest mal schauen ob die die VB DLL direkt als Verweis setzen kannst.
(Müsste dann eine interop dll rauskommen)

Ich habe schon einmal versucht die DLL als Verweis hinzuzufügen, aber leider wird mir dies nicht gewährt:

Es konnte kein Verweis auf "Pfad" hinzugefügt werden. Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass sie eine gültige Assembly oder COM-Komponente ist

-> Es ist definitiv eine gültige COM-Komponente! Man darf auf die Datei auch zugreifen.

Ich habe im Internet danach gesucht, aber keinen nachvollziebaren Lösungsweg gefunden.
Das hinzufügen des Verweises habe ich durch "Verweis hinzufügen-Durchsuchen-Auswählen" versucht.

Als Test habe ich eine simple Dll (in C# .NET) selber geschrieben, die ich dann als Verweis hinzufügen konnte (hatte gehofft, dass die gleiche Fehlermeldung erscheint, aber ich konnte es normal hinzufügen :O ). Auslesen konnte ich die Funktion ebenfalls. Ich frag mich nur, warum diese nicht im Dependency Walker als Funktion aufgeführt wurde.

Da es sich bei "MyDll.DLL" um eine native DLL handelt sollte das Aufrufen der DLL und Ihrer Funktion auch ohne Verweis gehen.

2. Mit x86 bei der Exe sollte es laufen. Meistens setzte ich es nur dort und lass bei den dlls weiterhin Any.
Wo hast du x86 gesetzt, im ConfigurationsManager oder in den Projekteigenschaften?
Ich setzt es immer in den Projekteigenschaften.

Die Einstellungen habe ich über die Projekteigenschaften gemacht. "Erstellen, Plattform: Any CPU; Zielplattform: x86"
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück