Может ли .NET PInvoke динамически загружать нативную DLL из указанной пользователем директории? - PullRequest
2 голосов
/ 10 февраля 2009

У меня есть приложение .NET, и мне нужно загрузить собственную библиотеку, местоположение которой указано пользователем. PInvoke выглядит так, как будто он будет загружаться только из глобальных путей поиска (или пути, указанного во время компиляции?). Будет ли лучший способ создать сборку C ++ / CLI, которая вызывает LoadLibrary во время выполнения?

Будет ли C ++ / CLI проще, чем C # PInvoking LoadLibrary?

Ответы [ 2 ]

7 голосов
/ 10 февраля 2009

Если у вас уже есть проект на C # / VB.Net, было бы намного проще просто использовать PInvoke LoadLibrary для загрузки DLL. Требуется один быстрый вызов PInvoke от существующей библиотеки 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) ;

}

Простое добавление этого кода будет намного быстрее, чем добавление полного проекта C ++ \ CLI.

0 голосов
/ 10 февраля 2009

Я согласен с JaredPar. После того, как вы загрузили dll, вам нужно будет получить доступ к API, предоставляемому dll, используя указатели функций, простые объявления PInvoke больше не будут работать, вам нужно будет использовать Windows API GetProcAddress ...

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

... и затем привяжите возвращенный адрес к делегату, используя GetDelegateForFunctionPointer () в пространстве имен System.Runtime.InteropServices.

...