C# api 动态加载C++的DLL函数方法

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文件的类:

 

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

 

 

代码
* 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,,成功
}

 

 

以上方法编译.

调用:

 

posted @ 2010-08-12 16:47  C#的【听初】  阅读(337)  评论(0编辑  收藏  举报