C++函数如下:
// testdll3.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern "C" __declspec(dllexport) int add(int * a,int * b)
{
return *a + *b;
}
C#中动态加载方法:
首先写一个加载DLL文件的类:
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
class
LoadDllAPI
{
[DllImport( " kernel32.dll " )]
public extern static IntPtr LoadLibrary( string path);
[DllImport( " kernel32.dll " )]
public extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport( " kernel32.dll " )]
public extern static bool FreeLibrary(IntPtr lib);
[DllImport( " kernel32.dll " )]
public static extern IntPtr GetStdHandle( int nStdHandle);
[DllImport( " user32 " , EntryPoint = " CallWindowProc " )]
public static extern int CallWindowProc(IntPtr lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);
}
#endregion
public class LoadDll
{
IntPtr DllLib; // DLL文件名柄
#region 构造函数
public LoadDll()
{ }
public LoadDll( string dllpath)
{
DllLib = LoadDllAPI.LoadLibrary(dllpath);
}
#endregion
/// <summary>
/// 析构函数
/// </summary>
~ LoadDll()
{
LoadDllAPI.FreeLibrary(DllLib); // 释放名柄
}
public void initPath( string dllpath)
{
if (DllLib == IntPtr.Zero)
{
DllLib = LoadDllAPI.LoadLibrary(dllpath);
}
}
/// <summary>
/// 获取DLL中一个方法的委托
/// </summary>
/// <param name="methodname"></param>
/// <param name="methodtype"></param>
/// <returns></returns>
public Delegate InvokeMethod( string methodname, Type methodtype)
{
IntPtr MethodPtr = LoadDllAPI.GetProcAddress(DllLib, methodname);
return (Delegate)Marshal.GetDelegateForFunctionPointer(MethodPtr, methodtype);
}
}
{
[DllImport( " kernel32.dll " )]
public extern static IntPtr LoadLibrary( string path);
[DllImport( " kernel32.dll " )]
public extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport( " kernel32.dll " )]
public extern static bool FreeLibrary(IntPtr lib);
[DllImport( " kernel32.dll " )]
public static extern IntPtr GetStdHandle( int nStdHandle);
[DllImport( " user32 " , EntryPoint = " CallWindowProc " )]
public static extern int CallWindowProc(IntPtr lpPrevWndFunc, int hwnd, int MSG, int wParam, int lParam);
}
#endregion
public class LoadDll
{
IntPtr DllLib; // DLL文件名柄
#region 构造函数
public LoadDll()
{ }
public LoadDll( string dllpath)
{
DllLib = LoadDllAPI.LoadLibrary(dllpath);
}
#endregion
/// <summary>
/// 析构函数
/// </summary>
~ LoadDll()
{
LoadDllAPI.FreeLibrary(DllLib); // 释放名柄
}
public void initPath( string dllpath)
{
if (DllLib == IntPtr.Zero)
{
DllLib = LoadDllAPI.LoadLibrary(dllpath);
}
}
/// <summary>
/// 获取DLL中一个方法的委托
/// </summary>
/// <param name="methodname"></param>
/// <param name="methodtype"></param>
/// <returns></returns>
public Delegate InvokeMethod( string methodname, Type methodtype)
{
IntPtr MethodPtr = LoadDllAPI.GetProcAddress(DllLib, methodname);
return (Delegate)Marshal.GetDelegateForFunctionPointer(MethodPtr, methodtype);
}
}
![ContractedBlock.gif](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
*
loadDLL.LoadDll loaddll
=
new
loadDLL.LoadDll();//实例化加载DLL文件的类,,如上
* public delegate int delegateadd(IntPtr a,IntPtr b);//声明此方法的一个委托
//一个调用用的按钮
private void button1_Click( object sender, EventArgs e)
{
loaddll.initPath( " testdll3.dll " );//载入文件
delegateadd m = (delegateadd)loaddll.InvokeMethod( " add " , typeof (add));//获取其中方法的委托
int a = 1 ; int b = 2 ;
int re = m( out a, out b); // 得到RE=3,,成功
}
* public delegate int delegateadd(IntPtr a,IntPtr b);//声明此方法的一个委托
//一个调用用的按钮
private void button1_Click( object sender, EventArgs e)
{
loaddll.initPath( " testdll3.dll " );//载入文件
delegateadd m = (delegateadd)loaddll.InvokeMethod( " add " , typeof (add));//获取其中方法的委托
int a = 1 ; int b = 2 ;
int re = m( out a, out b); // 得到RE=3,,成功
}
以上方法编译.
调用: