2012-04-03 4 views
0

Meine App funktioniert gut auf Win 7 x86 und x64 Testumgebung, aber auf Vista und XP tut es nicht.LoadLibrary-Funktion Null zurück in Vista und XP

hier ist der Beispielcode:

internal static class NativeMethods 
{ 

    [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    internal static extern bool SetDllDirectory(string lpPathName); 

    [DllImport("kernel32", SetLastError = true)] 
    internal static extern IntPtr LoadLibrary(string lpFileName); 
} 
.... 

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Native"); 
path = Path.Combine(path, string.Format("x{0}", IntPtr.Size*8)); 

NativeMethods.SetDllDirectory(path); 
IntPtr ptr2 = NativeMethods.LoadLibrary("SQLite.Interop.dll"); 

In Vista oder XP IntPtr == nicht null Angelegenheit x86 oder x64.

Lösung Build-Ziel unter .net Framework 2, x86.

Irgendwelche Ideen, wie man dieses Problem löst?

+0

Haben Sie versucht, .dll zum Bibliotheksnamen in der DllImport-Direktive hinzuzufügen? – guga

+0

Haben Sie überprüft, dass 'Pfad' korrekt ist? Sie fügen dem Pfad anscheinend 'x32' oder' x64' hinzu - aber das ist unter XP oder Vista möglicherweise nicht korrekt. Wo ist die 'SQLite.Interop.dll' installiert? – ChrisF

+0

Ja, ich überprüfe es, der Pfad ist korrekt. –

Antwort

1
IntPtr ptr2 = NativeMethods.LoadLibrary("SQLite.Interop.dll"); 

Das ist keine native Bibliothek, das ist eine .NET-Interop-Bibliothek für SQLite. Es enthält verwaltete Klassendeklarationen. Sie müssen Assembly.LoadFrom() verwenden, um es zu laden. Obwohl Sie es fast immer vorziehen, es einfach als Referenz zu Ihrem Projekt hinzuzufügen, schreiben Sie einfach viel Code auf diese Weise. Sie brauchen wahrscheinlich noch SetDllDirectory(), da SQLite im Kern nicht verwalteter Code ist, der in C geschrieben ist, so dass der Wrapper wahrscheinlich Hilfe benötigt, um sqlite.dll zu finden.

Nicht sicher, warum Sie dies tun, hat wahrscheinlich etwas mit 64-Bit-Betriebssystemen zu tun. Beachten Sie, dass dies ein Bereitstellungsproblem und kein Programmierproblem ist.

Verwandte Themen