tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1306
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    yukini yukini ist offline Rookie
    Registriert seit
    Nov 2009
    Beiträge
    7
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    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ß
     

  2. #2
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    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.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

  3. #3
    yukini yukini ist offline Rookie
    Registriert seit
    Nov 2009
    Beiträge
    7
    Ich bedanke mich für deine Antwort.

    Zitat Zitat von Spyke Beitrag anzeigen
    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.

    Zitat Zitat von Spyke Beitrag anzeigen
    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"
    Geändert von yukini (08.11.10 um 11:19 Uhr)
     

Ähnliche Themen

  1. System.IO.Ports einbinden , wie?
    Von Katerchen im Forum .NET Web und Kommunikation
    Antworten: 2
    Letzter Beitrag: 10.11.08, 09:11
  2. DllNotFoundException
    Von funny_laser im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 07.07.05, 08:09
  3. DllImport und System.DllNotFoundException
    Von Reticent im Forum .NET Archiv
    Antworten: 3
    Letzter Beitrag: 08.03.05, 11:52
  4. System.Drawing Grafik in ASP.NET Seite einbinden
    Von Quarkz im Forum .NET Archiv
    Antworten: 7
    Letzter Beitrag: 18.10.04, 04:52
  5. Antworten: 4
    Letzter Beitrag: 26.11.02, 08:31

Stichworte