【C#语法】C#中调用C++编写的dll

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”);


二.引入自定义dll

首先,新建一个名叫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类型,都会出现乱码或者程序的异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值