C#中引用C++生成的dll,首先我们需要新建一个类,如类名就叫做DllImport:
public class DllImport {
}
在类中,我们利用DllImport关键字进行dll的引用,格式如下:
[DllImport("xxx.dll")]
private static extern void xxx函数名(xxx函数);
需要注意的是在利用DllImport引入dll时,引入的接口必须由static extern声明,否则会报编译错误。
下面分别以引入系统的kernel32.dll以及我们自定义的dll为例进行说明。
一.引入kernel32.dll
class DllImport
{
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(
string section,//ini文?件t中D的Ì?段?落?
string key,//ini文?件t中D的Ì?关?键¨¹字Á?
string def,//无T法¤¡§读¨¢取¨?时º¡À设¦¨¨置?的Ì?默?认¨?值¦Ì
StringBuilder retVal,//读¨¢取¨?数ºy值¦Ì
int size,//数ºy值¦Ì大䨮小?
string filePath//ini文?件t完ª¨º整?的Ì?路¡¤径?和¨ª名?称?(ꡧ必À?须?是º?绝?对?路¡¤径?)ê?
);
/// <summary>
/// 读¨¢取¨?INI文?件t的Ì?数ºy据Y
/// </summary>
/// <param name="filePath">文?件t路¡¤径?</param>
/// <param name="section">文?件t中D的Ì?段?落?</param>
/// <param name="key">文?件t中D关?键¨¹字Á?</param>
/// <returns>返¤¦Ì回?关?键¨¹子Á¨®对?应®|的Ì?值¦Ì</returns>
public static string IniReadValue(string filePath,string section,string key)
{
StringBuilder temp=new StringBuilder(500);
int i = GetPrivateProfileString(section, key, "localhost", temp, 500, filePath);
return temp.ToString();
}
}
以上,我们引入的微软提供的kernel32.dll,并声明了其读取Ini文件的接口GetPrivateProfileString,我们将引入的接口进行封装,封装成公有的IniReadValue接口,通过如下方式进行调用:
DllImport. IniReadValue(“ServerConfig”,” Server”,”url”);
首先,新建一个名叫Testdll的MFC dll项目,我们定义一个如下的接口函数:
<pre name="code" class="cpp">void ShowMessage(char* message)
{
CString str1(message);
AfxMessageBox(str1);
}
函数的主要作用是将传入的字符串通过弹出框的方式进行显示。在项目的Testdll.def文件中定义导出接口:
LIBRARY
EXPORTS
ShowMessage @ 1; 此ä?处ä|可¨¦以°?是º?显?式º?导Ì?出?
然后我们继续在DllImport类中添加对Testdll.dll的引用:
class DllImport
{
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(
string section,//ini文?件t中D的Ì?段?落?
string key,//ini文?件t中D的Ì?关?键¨¹字Á?
string def,//无T法¤¡§读¨¢取¨?时º¡À设¦¨¨置?的Ì?默?认¨?值¦Ì
StringBuilder retVal,//读¨¢取¨?数ºy值¦Ì
int size,//数ºy值¦Ì大䨮小?
string filePath//ini文?件t完ª¨º整?的Ì?路¡¤径?和¨ª名?称?(ꡧ必À?须?是º?绝?对?路¡¤径?)ê?
);
/// <summary>
/// 读¨¢取¨?INI文?件t的Ì?数ºy据Y
/// </summary>
/// <param name="filePath">文?件t路¡¤径?</param>
/// <param name="section">文?件t中D的Ì?段?落?</param>
/// <param name="key">文?件t中D关?键¨¹字Á?</param>
/// <returns>返¤¦Ì回?关?键¨¹子Á¨®对?应®|的Ì?值¦Ì</returns>
public static string IniReadValue(string filePath,string section,string key)
{
StringBuilder temp=new StringBuilder(500);
int i = GetPrivateProfileString(section, key, "localhost", temp, 500, filePath);
return temp.ToString();
}
[DllImport("Testdll.dll")]
private static extern void ShowMessage(string str);
public static void Show(string str)
{
ShowMessage(str);
}
}
新建一个winform程序,界面上放置一个文本框和一个按钮,
private void button1_Click(object sender, EventArgs e)
{
DllImport.Show(message.Text);
}
验证效果:
需要注意的是,要想正常调用c++定义的接口,需要特别留意定义接口时的参数类型,如上述接口的参数采用的是char*的格式,可以被c#的string格式兼容,但是采用MFC中的CString类型或者C++标准库中的string类型,都会出现乱码或者程序的异常。