使用托管C++粘合C#和C++代码(一)

关于C#C++孰优孰劣的争论有很多,我不太喜欢这样的争论,感觉好像非要置对方于死地而后快。咱们伟大的毛主席说了:百花争放,百家齐鸣。

改革开放的总设计师邓小平也说了:黑猫白猫,逮住老鼠就是好猫。(呵呵,扯得太远了一点,愤青们千万不要砸砖头。)我想说的是:其实两种语言都各有自己的长处,取长补短才是硬道理。C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器。

当然在。NET平台上C++/CLI的功能也越来越强大,可是毕竟大多数人对Managed C++不太熟悉,用起来也不是太方便(毕竟掺合的东西太多了),纯粹用C++/CLI进行开发还是比较少见的。但是我们在实际开发中完全可以通过少量的Managed C++代码来粘合和包装C#和C++,真正的工作主体部分由C#和C++各尽其能的去完成,发挥各自的专长,这样一来少量的代码就可以打开任督二脉。

本篇中,首先示例讲解如何在C#代码中调用纯C++模块中的内容。

在本例中,C#界面调用C++的加法函数,实现两个字符串的相加。当然,是使用Managed C++为桥梁。实现步骤如下所示:

首先,建立一个纯C++的static library——PureCPPSLib,其中实现一个字符串相加的类。(步骤省略)

 
 
 
 
  1. class PureCClass
  2. {
  3. public:
  4. PureCClass();
  5. ~PureCClass(void);
  6. public:
  7. LPCTSTR getFirstName();
  8. void setFirstName(LPCTSTR fistName);
  9. LPCTSTR getLastName();
  10. void setLastName(LPCTSTR lastName);
  11. LPCTSTR joinName();
  12. private:
  13. CString m_FirstName;
  14. CString m_LastName;
  15. CString m_fullName;
  16. };
  17. PureCClass::PureCClass()
  18. {}
  19. PureCClass::~PureCClass(void)
  20. {}
  21. LPCTSTR PureCClass::getFirstName()
  22. {
  23. return (LPCTSTR)m_FirstName;
  24. }
  25. void PureCClass::setFirstName(LPCTSTR fistName)
  26. {
  27. m_FirstName = fistName;
  28. }
  29. LPCTSTR PureCClass::getLastName()
  30. {
  31. return (LPCTSTR)m_LastName;
  32. }
  33. void PureCClass::setLastName(LPCTSTR lastName)
  34. {
  35. m_LastName = lastName;
  36. }
  37. LPCTSTR PureCClass::joinName()
  38. {
  39. m_fullName = m_FirstName + _T(" ") +m_LastName;
  40. return (LPCTSTR)(m_fullName);
  41. }

第二步,如下所示建立一个托管的DYNAMIC LINK LIBRARY工程——MgdLib.

托管工程中导入PureCPPSLib的lib文件,include类PureCClass的头文件,构造一个托管类——mgClass,实现对类PureCClass的托管包装。该托管类放在namespace MgdLib 中。

 
 
 
 
  1. namespace MgdLib {
  2. public ref class mgClass
  3. {
  4. public:
  5. mgClass();
  6. protected:
  7. !mgClass();
  8. public:
  9. ~mgClass();
  10. property String^ FirstName
  11. {
  12. String ^ get ();
  13. void set (String ^str);
  14. }
  15. property String^ LastName
  16. {
  17. String ^ get ();
  18. void set (String ^str);
  19. }
  20. String^ JoinName();
  21. private:
  22. PureCClass* m_pImpObj;
  23. };
  24. }
  25. namespace MgdLib {
  26. mgClass::mgClass()
  27. {
  28. m_pImpObj = new PureCClass();
  29. }
  30. mgClass::!mgClass()
  31. {
  32. delete m_pImpObj;
  33. }
  34. mgClass::~mgClass()
  35. {
  36. this->!mgClass();
  37. }
  38. String ^ mgClass::FirstName::get()
  39. {
  40. return gcnew String(m_pImpObj->getFirstName());
  41. }
  42. void mgClass::FirstName::set(String^ str)
  43. {
  44. pin_ptr wch = PtrToStringChars(str);
  45. m_pImpObj->setFirstName(((std::wstring)wch).c_str());
  46. }
  47. String ^ mgClass::LastName::get()
  48. {
  49. return gcnew String(m_pImpObj->getLastName());
  50. }
  51. void mgClass::LastName::set(String^ str)
  52. {
  53. pin_ptr wch = PtrToStringChars(str);
  54. m_pImpObj->setLastName(((std::wstring)wch).c_str());
  55. }
  56. String ^ mgClass::JoinName ()
  57. {
  58. return gcnew String(m_pImpObj->joinName());
  59. }
  60. }

然后,建立C#界面工程。C#工程reference引用托管工程生成的MgdLib.dll,并using命名空间MgdLib,就可以实现对托管包装类mgClass的调用了。(为了正确编译,需要调整好三个工程之间的依赖关系)

"Connect" Button 的单击函数里添加代码:

 
 
 
 
  1. private void btnConnect_Click(object sender, EventArgs e)
  2. {
  3. mgClass myC = new mgClass();
  4. myC.FirstName = txtFirstName.Text;
  5. myC.LastName = txtLastName.Text;
  6. String str = myC.JoinName();
  7. txtFullName.Text = str;

最终的运行结果:

网页名称:使用托管C++粘合C#和C++代码(一)
文章路径:http://www.hantingmc.com/qtweb/news33/420733.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联