Yes, it is possible, you will need to complete part of the task that the P / Invoke marshaller does. Download the DLL and search for the entry point of the exported function. Start by declaring a delegate whose signature matches the exported function:
private delegate byte start_api(byte pid, byte stat, byte dbg, byte ka);
Then use this code:
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);
Many ways to do it wrong. Note that you must use the actual exported name from the DLL, you no longer get help from Marshall P / Invoke to help decorate the names. Use dumpbin.exe / exports in the DLL if you do not know what the export name looks like.
Hans Passant May 12 '10 at 12:58 a.m. 2010-05-12 12:58
source share