WEB开发网
开发学院WEB开发ASP.NET 在C#中使用C++编写的类 阅读

在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++类。

1 2  下一页

Tags:C# C++

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接