C++調用C#類庫 && 非託管C++字符串和託管字符串的轉換

 
C#代碼
using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestClassLibrary
{
public class Test
{
public int TestAdd(int x, int y)
{
return x + y;
}
public string TestString(string str1, string str2)
{
string strb = str1 + str2;
return strb;
}
}
}
 
C++代碼
#pragma warning (disable: 4278)
 
#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <vcclr.h>
#using <mscorlib.dll>
 
using namespace std;
using namespace TestClassLibrary;
using namespace System;
using namespace System::Runtime::InteropServices;
 
int TestInt(int, int);
char* TestString(char *pStr1, char *pStr2);
String^ UnmanagedStringA2ManagedString(char *pIn);
char* ManagedString2UnmanagedStringA(String^ strIn);
 
//以下爲託管代碼
#pragma managed
int TestInt(int x, int y)
{   
Test t;
return t.TestAdd(x, y);
}
 
char* TestString(char *pStr1, char *pStr2)
{
Test t;
String ^str1, ^str2;
str1 = UnmanagedStringA2ManagedString(pStr1);
str2 = UnmanagedStringA2ManagedString(pStr2);
String^ s = t.TestString(str1, str2);
char *pResult = ManagedString2UnmanagedStringA(s);
return pResult;
}
 
//將非託管的ANSI字符串轉換成託管字符串 
String^ UnmanagedStringA2ManagedString(char *pIn)
{
String^ strOut = Marshal::PtrToStringAnsi(static_cast<IntPtr>(pIn));
return strOut;
}
 
//將託管字符串轉換成非託管的ANSI字符串 
char* ManagedString2UnmanagedStringA(String^ strIn)
{
IntPtr ip = Marshal::StringToHGlobalAnsi(strIn);
const char* pTemp = static_cast<const char*>(ip.ToPointer());
char *pOut = new char[strlen(pTemp)+1];
strcpy(pOut, pTemp);
Marshal::FreeHGlobal( ip );
return pOut;
}
 
//以下爲非託管代碼 
#pragma unmanaged
void _tmain()
{
int x(1), y(1), iResult;
char *pStr1 = "Str1.";
char *pStr2 = "Str2.";
char *pResult;
DWORD dwStart, dwEnd;
 
iResult = TestInt(x, y);
pResult = TestString(pStr1, pStr2);
cout<<"TestInt:/nx="<<x<<" y="<<y<<"/nresult:"<<iResult<<endl<<endl;
cout<<"TestSting:/nStr1="<<pStr1<<" Str2="<<pStr2<<"/nresult:"<<pResult<<endl;
cin>>iResult;   
}
 
運行結果
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章