C#通過相對路徑調用C++的dll

首先我们用[DllImport("kernel32.dll")]private extern static IntPtr LoadLibrary(String path);[DllImport("kernel32.dll")]private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);[DllImport("kernel32.dll")]private extern static bool FreeLibrary(IntPtr lib);分别取得了LoadLibrary和GetProcAddress函数的地址,再通过这两个函数来取得我们的DLL里面的函数。我们可以先用Server.MapPath(@"~/Bin/Judge.dll")来取得我们的DLL的物理路径,然后再用LoadLibrary进行载入,最后用GetProcAddress取得要用的函数地址以下自定义类的代码完成LoadLibrary的装载和函数调用:

public class DllInvoke {

[DllImport("kernel32.dll")]

private extern static IntPtr LoadLibrary(String path);

[DllImport("kernel32.dll")]

private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);

[DllImport("kernel32.dll")]

private extern static bool FreeLibrary(IntPtr lib);

private IntPtr hLib;

public DllInvoke(String DLLPath)

{

hLib = LoadLibrary(DLLPath);

}

~DllInvoke()

{

FreeLibrary(hLib);

}

//将要执行的函数转换为委托

public Delegate Invoke(String APIName,Type t)

{

IntPtr api = GetProcAddress(hLib, APIName);

return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);

}

}

我自己使用的代碼:

[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(String path);
[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib);

public delegate int GetFileId([MarshalAs(UnmanagedType.LPTStr)] StringBuilder fileName, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder certSubjectName);

public static bool invokeDLL(string filename)
{
IntPtr hLib;
string dllPath = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "GetFileId.dll");
hLib = LoadLibrary(dllPath);

IntPtr api = GetProcAddress(hLib, "GetFileId");
GetFileId getFileId = (GetFileId)Marshal.GetDelegateForFunctionPointer(api, typeof(GetFileId));
long fileId = getFileId(new StringBuilder(filename), new StringBuilder(FTPNET.certValidator.CertName));

FreeLibrary(hLib);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值