在C#中使用C++编写的类
2010-10-16 09:19:07 来源:WEB开发网核心提示:现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额,在C#中使用C++编写的类,因此很多以前搞VC++开发的人都转向用更强大的VS.Net,在这种情况下,那就是用托管C++将C++类给封装一下,然后再提供给C#来使用,有很多开发人员就面临了如何在C#中使用C++开发好的类的问题,下面就用一个完整的实
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额。因此很多以前搞VC++开发的人都转向用更强大的VS.Net。在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类的问题。下面就用一个完整的实例来详细说明怎样用托管C++封装一个C++类以提供给C#使用。
比如,现在有一个工程名为NativeCppDll的由C++编写的DLL,里面输出了一个CPerson类。下面是具体的代码:
// NativeCppDll.h #pragma once #ifndef LX_DLL_CLASS_EXPORTS #define LX_DLL_CLASS __declspec(dllexport) #else #define LX_DLL_CLASS __declspec(dllimport) #endif class LX_DLL_CLASS CPerson { public: CPerson(); CPerson(const wchar_t *pName, const wchar_t cSex, int iAge); void SetName(const wchar_t *pName); wchar_t * GetName(); void SetSex(const wchar_t cSex); wchar_t GetSex(); void SetAge(int iAge); int GetAge(); wchar_t * GetLastError(); private: wchar_t m_szName[128]; wchar_t m_cSex; int m_iAge; wchar_t m_szLastError[128]; void ShowError(); }; // NativeCppDll.cpp #include "stdafx.h" #include "NativeCppDll.h" #include <iostream> #include <tchar.h> using namespace std; CPerson::CPerson() { wcscpy_s(m_szName, _T("No Name")); m_cSex = 'N'; m_iAge = 0; wcscpy_s(m_szLastError, _T("No Error")); } CPerson::CPerson(const wchar_t *pName, const wchar_t cSex, int iAge) { wcscpy_s(m_szLastError, _T("No Error")); SetName(pName); SetSex(cSex); SetAge(iAge); } void CPerson::SetName(const wchar_t *pName) { if ((pName == NULL) || (wcslen(pName) == 0) || (wcslen(pName) > 127)) { wcscpy_s(m_szName, _T("No Name")); wcscpy_s(m_szLastError, _T("The length of the input name is out of range.")); ShowError(); return; } wcscpy_s(m_szName, pName); } wchar_t * CPerson::GetName() { return m_szName; } void CPerson::SetSex(const wchar_t cSex) { if ((cSex != 'F') && (cSex != 'M') && (cSex != 'm') && (cSex != 'f')) { m_cSex = 'N'; wcscpy_s(m_szLastError, _T("The input sex is out of [F/M].")); ShowError(); return; } m_cSex = cSex; } wchar_t CPerson::GetSex() { return m_cSex; } void CPerson::SetAge(int iAge) { if ((iAge < 0) || (iAge > 150)) { m_iAge = 0; wcscpy_s(m_szLastError, _T("The input age is out of range.")); ShowError(); return; } m_iAge = iAge; } int CPerson::GetAge() { return m_iAge; } wchar_t * CPerson::GetLastError() { return m_szLastError; } void CPerson::ShowError() { cerr << m_szLastError << endl; }
这是一个很典型的由C++开发的DLL,输出一个完整的C++类。如果现在要求开发一个C#工程,需要用到这个DLL中输出的C++类CPerson,该怎么办呢?针对这个例子来说,类CPerson非常小,可以用C#重新写一个跟这个C++类一样的类。可是,如果需要的C++类很大,或者很多的时候,重写工程将非常庞大。而且这样没有对现有的代码进行重用,浪费了现有资源,开发起来费时费力。
当然,还是有方法解决这个问题的。那就是用托管C++将C++类给封装一下,然后再提供给C#来使用。下面就用代码来详细说明怎样用托管C++来封装上面的那个C++类。
更多精彩
赞助商链接