json在c语言中使用 c 在C#中使用C

导读:在Csharp中使用C++编写的类(zt),有很多开发人员就面临了如何在C#中使用C++开发好的类的问题,下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使用,然后再提供给C#来使用,这也是让类Person能在C#中使用的首要条件,在Csharp中使用C++编写的类(zt)现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC++

在Csharp中使用C++编写的类(zt)

现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC++开发的人都转向用更强大的VS.Net。在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类的问题。下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使用。

比如,现在有一个工程名为NativeCppDll的由C++编写的DLL,里面输出了一个CPerson类。下面是具体的代码: 1. // NativeCppDll.h

2. #pragma once

3. #ifndef LX_DLL_CLASS_EXPORTS

4. #define LX_DLL_CLASS __declspec(dllexport)

5. #else

6. #define LX_DLL_CLASS __declspec(dllimport)

7. #endif

8. class LX_DLL_CLASS CPerson

9. {

10. public:

11. CPerson();

12. CPerson(const wchar_t *pName, const wchar_t cSex, int iAge);

13. void SetName(const wchar_t *pName);

14. wchar_t * GetName();

15. void SetSex(const wchar_t cSex);

16. wchar_t GetSex();

17. void SetAge(int iAge);

18. int GetAge();

19. wchar_t * GetLastError();

20. private:

21. wchar_t m_szName[128];

22. wchar_t m_cSex;

23. int m_iAge;

24. wchar_t m_szLastError[128];

25. void ShowError();

26. };

27. // NativeCppDll.cpp

28. #include "stdafx.h"

29. #include "NativeCppDll.h"

30. #include <iostream>

31. #include <tchar.h>

32. using namespace std;

33. CPerson::CPerson()

34. {

35. wcscpy_s(m_szName, _T("No Name"));

36. m_cSex = 'N';

37. m_iAge = 0;

38. wcscpy_s(m_szLastError, _T("No Error"));

39. }

40. CPerson::CPerson(const wchar_t *pName, const wchar_t cSex, int iAge)

41. {

42. wcscpy_s(m_szLastError, _T("No Error"));

43. SetName(pName);

44. SetSex(cSex);

45. SetAge(iAge);

46. }

47. void CPerson::SetName(const wchar_t *pName)

48. {

49. if ((pName == NULL) || (wcslen(pName) == 0) || (wcslen(pName) > 127))

50. {

51. wcscpy_s(m_szName, _T("No Name"));

52. wcscpy_s(m_szLastError, _T("The length of the input name is out of range."));

53. ShowError();

54. return;

55. }

56. wcscpy_s(m_szName, pName);

57. }

58. wchar_t * CPerson::GetName()

59. {

60. return m_szName;

61. }

62. void CPerson::SetSex(const wchar_t cSex)

63. {

64. if ((cSex != 'F') && (cSex != 'M') && (cSex != 'm') && (cSex != 'f'))

65. {

66. m_cSex = 'N';

67. wcscpy_s(m_szLastError, _T("The input sex is out of [F/M]."));

68. ShowError();

69.

70. return;

71. }

72. m_cSex = cSex;

json在c语言中使用 c 在C#中使用C

73. }

74. wchar_t CPerson::GetSex()

75. {

76. return m_cSex;

77. }

78. void CPerson::SetAge(int iAge)

79. {

80. if ((iAge < 0) || (iAge > 150))

81. {

82. m_iAge = 0;

83. wcscpy_s(m_szLastError, _T("The input age is out of range."));

84. ShowError();

85. return;

86. }

87. m_iAge = iAge;

88. }

89. int CPerson::GetAge()

90. {

91. return m_iAge;

92. }

93. wchar_t * CPerson::GetLastError()

94. {

95. return m_szLastError;

96. }

97. void CPerson::ShowError()

98. {

99. cerr << m_szLastError << endl;

100. }

这是一个很典型的由C++开发的DLL,输出一个完整的C++类。如果现在要求开发一个C#工程,需要用到这个DLL中输出的C++类CPerson,该怎么办呢?针对这个例子来说,类CPerson非常小,可以用C#重新写一个跟这个C++类一样的类。可是,如果需要的C++类很大,或者很多的时候,重写工程将非常庞大。而且这样没有对现有的代码进行重用,浪费了现有资源,开发起来费时费力。

当然,还是有方法解决这个问题的。那就是用托管C++将C++类给封装一下,然后再提供给C#来使用。下面就用代码来详细说明怎样用托管C++来封装上面的那个C++类。

首先,要创建一个托管C++的DLL工程ManageCppDll,然后在里面添加下面的代码:

1. // ManageCppDll.h

2. #pragma once

3. #define LX_DLL_CLASS_EXPORTS

4. #include "..NativeCppDllNativeCppDll.h"

5. using namespace System;

6. namespace ManageCppDll

7. {

8. public ref class Person

9. {

10. // 包装所有类CPerson的公有成员函数

11. public:

12. Person();

13. Person(String ^ strName, Char cSex, int iAge);

14. ~Person();

15. property String ^ Name

16. {

17. void set(String ^ strName);

18. String ^ get();

19. }

20. property Char Sex

21. {

22. void set(Char cSex);

23. Char get();

24. }

25. property int Age

26. {

27. void set(int iAge);

28. int get();

29. }

30. String ^ GetLastError();

31. private:

32. // 类CPerson的指针,用来调用类CPerson的成员函数

33. CPerson *m_pImp;

34. };

35. };

从这个头文件就能看出来,这是对C++类CPerson的包装。类Person的所有公有成员函数都跟C++类CPerson一样,只不过成员函数的参数和返回值就改成了托管C++的类型,这也是让类Person能在C#中使用的首要条件。当然只需要对公有成员函数进行封装,对于保护成员函数和私有成员函数则不必做任何封装。

类Person仅有一个私有的成员变量:一个类CPerson的指针。而类Person的所有成员函数的实现都是靠这个CPerson指针来调用类CPerson的相应成员函数来实现。

下面是具体的实现代码:

1. // ManageCppDll.cpp

2. #include "stdafx.h"

3. #include "ManageCppDll.h"

4. #include <vcclr.h>

5. namespace ManageCppDll

6. {

7. // 在构造函数中创建类CPerson的对象并在析构函数中将该对象销毁

8. // 所有的成员函数实现都是通过指针m_pImp调用类CPerson的相应成员函数实现

9. Person::Person()

10. {

11. m_pImp = new CPerson();

12. }

13. Person::Person(String ^ strName, Char cSex, int iAge)

爱华网www.aIhUaU.com网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。  

爱华网本文地址 » http://www.aihuau.com/a/356251/105340069255.html

更多阅读

C语言中的static函数 c语言中的变量

内部函数和外部函数函数一旦定义后就可被其它函数调用。 但当一个源程序由多个源文件组成时, 在一个源文件中定义的函数能否被其它源文件中的函数调用呢?为此,C语言又把函数分为两类:一、内部函数如果在一个源文件中定义的函数只能被本

C语言中的函数指针与指针函数 c语言中函数指针

函数是任何一门语言中必不可少的部分,正是由这些函数组成了程序。首先谈一下C语言中的函数指针与指针函数,再了解一下函数参数传递的相关原理。1.函数指针与指针函数(1) 函数指针 即指向这个函数的指针,定义为 数据类型 (*fun)(参数列

Objective-C条件运算符 c语言中条件运算符

Objective-C语言中最普通的运算符很可能是一种名为条件运算符的运算符。与Objective-C中的其他运算符不同(它们不是一元运算符就是二元运算符),条件运算符是三元运算符。就是说,它要接受 3个运算数。用于表示这种运算符的两个符号是问

在R语言中进行集合运算 r语言运算符

在实际工作中,我们经常需要进行一些集合运算,在R中怎么实现呢?当然用不着写for或者while循环那么复杂了,R已经为我们提供了非常强大的集合运算系列函数,下面就简单的介绍一下这些函数(假设A,B,C为三个集合):#首先对集合A,B,C赋值> A<-1:1

声明:《json在c语言中使用 c 在C#中使用C》为网友木马在旋转分享!如侵犯到您的合法权益请联系我们删除