visual usar una studio que libreria editar crear compilar como clases biblioteca archivo .net directory pinvoke native loadlibrary

usar - ¿Puede.NET PInvoke cargar dinámicamente un dll nativo desde un directorio especificado por el usuario?



editar archivo dll visual studio (2)

Tengo una aplicación .NET y necesito cargar una biblioteca nativa cuya ubicación es especificada por el usuario. PInvoke parece que solo se cargará desde las rutas de búsqueda globales (o una ruta especificada en tiempo de compilación?). ¿El mejor método sería crear un ensamblado C ++ / CLI que llame a LoadLibrary en tiempo de ejecución?

¿C ++ / CLI sería más simple que C # PInvoking LoadLibrary?


Estoy de acuerdo con JaredPar. Una vez que hayas descargado el dll, necesitarás acceder a la API expuesta por el dll usando punteros a funciones declaraciones de PInvoke simples ya no funcionarán, necesitarás usar la API de Windows GetProcAddress ...

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

... y luego enlazar la dirección devuelta a un delegado utilizando GetDelegateForFunctionPointer () en el espacio de nombres System.Runtime.InteropServices.


Si ya tiene un proyecto C # / VB.Net, sería mucho más simple simplemente invocar LoadLibrary para obtener una DLL para cargar. Se necesita una llamada de PInvoke rápida de la DLL existente

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) ; }

Solo agregar este código sería mucho más rápido que agregar un proyecto completo de C ++ / CLI.