Establecer el atributo DllImport dinámicamente

Estoy haciendo uso de un dll externo no administrado usando PInvoke y el atributo DllImport. p.ej.

[DllImport("mcs_apiD.dll", CharSet = CharSet.Auto)] private static extern byte start_api(byte pid, byte stat, byte dbg, byte ka); 

Me pregunto si es posible alterar los detalles del archivo dll (mcs_apiD.dll en este ejemplo) dinámicamente de alguna manera, si, por ejemplo, quisiera comstackr contra otra versión dll

Sí, esto es posible, tendrá que hacer parte del trabajo que hace el contador de visitas P / Invocar. Cargando la DLL y encontrando el punto de entrada de la función exportada. Comience por declarar un delegado cuya firma coincida con la función exportada:

  private delegate byte start_api(byte pid, byte stat, byte dbg, byte ka); 

Luego usa un código como este:

  using System.ComponentModel; using System.Runtime.InteropServices; ... static IntPtr dllHandle; ... if (dllHandle == IntPtr.Zero) { dllHandle = LoadLibrary("mcs_apiD.dll"); if (dllHandle == IntPtr.Zero) throw new Win32Exception(); } IntPtr addr = GetProcAddress(dllHandle, "_start_api@16"); if (addr == IntPtr.Zero) throw new Win32Exception(); var func = (start_api)Marshal.GetDelegateForFunctionPointer(addr, typeof(start_api)); var retval = func(1, 2, 3, 4); ... [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr LoadLibrary(string name); [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)] private static extern IntPtr GetProcAddress(IntPtr hModule, string name); 

Muchas formas de equivocarse, por supuesto. Tenga en cuenta que debe usar el nombre exportado real de la DLL, ya no obtendrá la ayuda del marcador de P / Invoke para ayudar con la decoración del nombre. Use dumpbin.exe / exports en la DLL si no está seguro de cómo se ve el nombre de la exportación.

no puede cambiar el nombre de la DLL pero puede modificar la ruta de la biblioteca que se está cargando (por ejemplo, leyéndola desde el registro o un archivo de configuración) y cargarla manualmente con la función de LoadLibrary kernel32: vea mi respuesta allí .