2012-04-10 8 views
2

Ich versuche, eine gemischte verwaltete/native DLL zu laden, die ich für 32 Bit und für 64 Bit kompiliert habe. Wenn ich mein Programm unter Windows 7 32 Bit ausführen, kann ich die 32-Bit-DLL problemlos laden. Wenn ich die 64-Bit-DLL lade, bekomme ich BadImageFormatException, was ich erwartet habe.FileNotFoundException mit Assembly.LoadFile unter Windows 7 64 Bit

Das Problem, das ich habe, ist, wenn ich den gleichen Test unter Windows 7 64 Bit zu tun:

Wenn ich die 32-Bit-DLL zu laden, erhalte ich BadImageFormatException. Das ist soweit in Ordnung.

Aber wenn ich die 64-Bit-DLL lade, bekomme ich FileNotFoundException. Und diese Information ist einfach nicht wahr, weil ich die Existenz dieser DLL vorher überprüfe!

Kann mir jemand sagen, warum ich meine 64-Bit-DLL unter Windows 7 64 Bit nicht laden kann?

Hier ist mein Beispielcode:

private void Button32_Click(object sender, RoutedEventArgs e) 
    { 
     string path = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "x86", "Native.dll"); 
     LoadAssembly(path); 
    } 
    private void Button64_Click(object sender, RoutedEventArgs e) 
    { 
     string path = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "amd64", "Native.dll"); 
     LoadAssembly(path); 
    } 

    void LoadAssembly(string path) 
    { 
     if(File.Exists(path)) 
     { 
      MessageBox.Show("Loading " + path); 
      Assembly asm = null; 
      try 
      { 
       asm = Assembly.LoadFile(path); 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show("Exception!!!\n" + ex); 
      } 
      MessageBox.Show("Success " + (asm == null ? "no" : "yes")); 
     } 
    } 

Antwort

2

Sie sollten versuchen, zu wissen, welche Assembly nicht geladen werden kann, weil vielleicht die Montage Sie versuchen, Referenzen zu laden, die nicht gefunden werden kann. Oder Referenz sind vorhanden, aber für 32-Bit, nicht die 64-Bit-Version

Try Fusion log zu benutzen, um genau zu wissen, was die Montage fehlt

+0

Ihre Antwort führte mich auf den Blog von Suzanne Cook in http://blogs.msdn.com /b/suzcook/archive/2003/05/29/57120.aspx was mir geholfen hat, die Lösung zu finden. Die systemeigene DLL referenzierte msvcr100.dll, die auf dem System fehlte. Das Fusionsprotokoll half hier nicht, aber Dependency Walker tat es. – MTR