C++/CLI的封送處理

字號:

//
    現(xiàn)在有本機代碼的C++類ClassCpp和CLI代碼的C++類EncapCpp2Csharp
    使用VC++2008的/clr編譯選項編譯可為.NET語言可引用的DLL
    //
    #include
    #include
    #include
    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();
    //轉(zhuǎn)換為.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();
    }
    }
    }