not Kann.NET PInvoke eine native DLL dynamisch aus einem vom Benutzer angegebenen Verzeichnis laden?




c# loadlibrary (2)

Ich stimme JaredPar zu. Sobald Sie die DLL geladen haben, müssen Sie Zugriff auf die API von der DLL durch Funktionszeiger zur Verfügung gestellt einfache PInvoke Deklarationen werden nicht mehr funktionieren müssen Sie die Windows-API GetProcAddress verwenden ...

[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true)]
public static extern UIntPtr GetProcAddress(IntPtr hModule, string procName);

... und binden Sie dann die zurückgegebene Adresse mithilfe GetDelegateForFunctionPointer () im System.Runtime.InteropServices-Namespace an einen Delegaten.

Ich habe eine .NET-Anwendung und muss eine native Bibliothek laden, deren Speicherort vom Benutzer angegeben wird. PInvoke sieht so aus, als ob es nur von den globalen Suchpfaden (oder einem Pfad, der zur Kompilierzeit angegeben wurde) geladen wird. Wäre die beste Methode, eine C ++ / CLI-Assembly zu erstellen, die LoadLibrary zur Laufzeit aufruft?

Wäre C ++ / CLI einfacher als C # PInvoing LoadLibrary?


Wenn Sie bereits ein C # / VB.Net-Projekt haben, wäre es viel einfacher, PInvoke LoadLibrary zu starten, um eine DLL zum Laden zu bekommen. Es dauert ein kurzer PInvoke-Aufruf von der vorhandenen DLL

public partial class NativeMethods {

    /// Return Type: HMODULE->HINSTANCE->HINSTANCE__*
    ///lpLibFileName: LPCWSTR->WCHAR*
    [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint="LoadLibraryW")]
public static extern  System.IntPtr LoadLibraryW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string lpLibFileName) ;

}

Das Hinzufügen dieses Codes wäre viel schneller als das Hinzufügen eines vollständigen C ++ \ CLI-Projekts.





loadlibrary