//=======================================================================================
现在有本机代码的C++类ClassCpp和CLI代码的C++类EncapCpp2Csharp
使用VC++2008的/clr编译选项编译可为.NET语言可引用的DLL
//=======================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
class ClassCpp
{
public:
ClassCpp(void){ strcpy_s(m_szTemp,""); }
virtual ~ClassCpp(void){}
public:
void SetString(const char* pchar)
{
strcpy_s(m_szTemp,pchar);
printf("%s/n",m_szTemp);
}
const char* GetString()
{
strcpy_s(m_szTemp,"Hello! 我是 C++.");
return m_szTemp;
}
private:
char m_szTemp[128];
};
//=======================================================================================
using namespace System;
using namespace System::Runtime::InteropServices;
//CLI代码C++类
namespace SnycStudio { namespace EncapsulationTest {
//测试[C++ ==> C# & C# ==> C++] 的封送处理
public ref class EncapCpp2Csharp
{
public:
EncapCpp2Csharp(void) { m_pClassCpp = new ClassCpp; }
virtual ~EncapCpp2Csharp(void) { delete m_pClassCpp; }
public:
//字符串
void SetString(String^ str)
{
char* pch = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();
m_pClassCpp->SetString(pch); //把.NET的String类型传递到本机代码类ClassCpp
}
String^ GetString()
{
//取得本机代码类的字符串
const char* pch = m_pClassCpp->GetString();
//转换为.NET的String类型
String^ str = Marshal::PtrToStringAnsi((IntPtr)(char*)pch);
return str;
}
void GetString(String^% str)
{
const char* pch = m_pClassCpp->GetString();
str = Marshal::PtrToStringAnsi((IntPtr)(char*)pch);
}
private:
ClassCpp* m_pClassCpp;
};
}}
//=======================================================================================
//C#程序
//=======================================================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SnycStudio.EncapsulationTest;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
EncapCpp2Csharp ec2s = new EncapCpp2Csharp();
string strTemp1 = ec2s.GetString();
Console.WriteLine(strTemp1);
string strTemp2 = "";
ec2s.GetString(ref strTemp2);
Console.WriteLine(strTemp1);
Console.ReadLine();
}
}
}