A little snippet I wrote while trying to use LoadLibrary/GetProcAddress to call functions and get variable values that are exported by an unmanaged dll with P/Invoke.
extern "C" __declspec(dllexport) const char* _Version = "0.1"; extern "C" __declspec(dllexport) const char* GetMyVersion(void) { return _Version; }
[TestMethod] public void TestPinvoke() { IntPtr lib = LoadLibrary(@"C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\TestWinDll\Debug\TestWinDll.dll"); if(lib == IntPtr.Zero) throw new Win32Exception(Marshal.GetLastWin32Error()); IntPtr procAddress = GetProcAddress(lib, "GetMyVersion"); var gmv = (GetMyVersion)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(GetMyVersion)); var ver = gmv(); procAddress = Marshal.ReadIntPtr(GetProcAddress(lib, "_Version")); var ver2 = Marshal.PtrToStringAnsi(procAddress); if(!FreeLibrary(lib)) throw new Win32Exception(Marshal.GetLastWin32Error()); } [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate String GetMyVersion(); [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Unicode)] static extern IntPtr LoadLibrary(string lpFileName); [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)] static extern IntPtr GetProcAddress(IntPtr hModule, string procName); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] static extern bool FreeLibrary(IntPtr hModule);