using System.Runtime.InteropServices;[DllImport("VC.DLL", EntryPoint="GetName")] public static extern int GetName( string strID);
using System.Text; using System.Runtime.InteropServices;[DllImport("VC.DLL", EntryPoint="GetName")] public static extern int GetName( int intPara1, out intPara2, ref intPara3, string strPara4, out string strPara5, ref string strPara6, StringBuilder strPara7); 部分参数对照表: C++ I/O C# char kaigo_path[MAX_PATH] O StringBuilder KCA_DIR I int LPCSTR I string int I int LPSTR O StringBuilder int* O out int DWORD I int DWORD* O out int BOOL I bool Rc_DBMgr I IntPtr long* O out long另:StringBuilder在使用时,必须指定大小: StringBuilder strPara = new StringBuilder(255);
using System.Runtime.InteropServices;[DllImport("XXX.DLL",EntryPoint="GetApiFunction",SetLastError=true)] public static extern int GetApiFunction( string strParaA, StringBuilder strParaB, int intParaC, out int intParaD, bool blnParaE);C++数据类型和C#的部分对应关系:C++ 输入输出 C# ================================== char chr[255] O StringBuilder KCA_DIR I int LPCSTR I string int I int LPSTR O StringBuilder int* O out int DWORD I int DWORD* O out int BOOL I bool Rc_DBMgr I IntPtr long* O out long
public static extern int GetName(
string strID);
using System.Runtime.InteropServices;[DllImport("VC.DLL", EntryPoint="GetName")]
public static extern int GetName(
int intPara1,
out intPara2,
ref intPara3,
string strPara4,
out string strPara5,
ref string strPara6,
StringBuilder strPara7);
部分参数对照表:
C++ I/O C#
char kaigo_path[MAX_PATH] O StringBuilder
KCA_DIR I int
LPCSTR I string
int I int
LPSTR O StringBuilder
int* O out int
DWORD I int
DWORD* O out int
BOOL I bool
Rc_DBMgr I IntPtr
long* O out long另:StringBuilder在使用时,必须指定大小:
StringBuilder strPara = new StringBuilder(255);
public static extern int GetApiFunction(
string strParaA,
StringBuilder strParaB,
int intParaC,
out int intParaD,
bool blnParaE);C++数据类型和C#的部分对应关系:C++ 输入输出 C#
==================================
char chr[255] O StringBuilder
KCA_DIR I int
LPCSTR I string
int I int
LPSTR O StringBuilder
int* O out int
DWORD I int
DWORD* O out int
BOOL I bool
Rc_DBMgr I IntPtr
long* O out long
关于dll的创建,应该将Vc代码函数以extern "C" __declspec(dllexport) 处理后再被调用。
该类中有一个方法:
public double GetSum(double x,double y)
{
return x+y;
}
编译后dll文件的存放路径是:D:\Test\HSMP.CommonBasic.dll
现在的问题是,如何通过程序调用该dll文件中的GetSum方法
大概有以下几步:
using System.Reflection;
A.
//这里要用LoadFrom,只有在本工程里添加了该dll的引用后才可以使用Load
Assembly objAss = Assembly.LoadFrom(@"D:\Test\HSMP.CommonBasic.dll");
//HSMP.CommonBasic.Common.StringUtil类的全路径
Type t=objAss.GetType("HSMP.CommonBasic.Common.StringUtil");
//动态生成类StringUtil的实例
object obj=System.Activator.CreateInstance(t);
//参数信息,GetSum需要两个int参数,如果方法没有参数,就声明一个长度为0的数组
System.Type[] paramTypes = new System.Type[2];
paramTypes[0] = System.Type.GetType("System.Int32");
paramTypes[1] = System.Type.GetType("System.Int32");
//找到对应的方法
MethodInfo p = t.GetMethod("GetSum", paramTypes)
//参数值,如果所调用的方法没有参数,不用写这些
Object[] parameters = new Object[2];
parameters[0] = 3;
parameters[1] = 4;
object objRetval = p.Invoke(obj, parameters); //如果没有参数,写null即可。
private static extern int WritePrivateProfileString(string section ,string key , string val , string filePath ) ;
#region 写INI文件
/// <summary>
/// 写入INI文件的方法
/// </summary>
/// <param name="section">段值</param>
/// <param name="Key">INI文件的键名</param>
/// <param name="sVal">INI文件的键值</param>
public static void WritePara(string section,string Key,string sVal)
{
try
{
WritePrivateProfileString(section,Key,sVal,fileName);
}
catch(System.Exception e)
{
m_log.cWriteLog.WriteErrMsg(e);
}
}
#endregion