Native C++ Wrapper Managed C++

来源:互联网 发布:t110e4没砍之前的数据 编辑:程序博客网 时间:2024/04/28 16:40

1.建一个Managed C++ 工程.

 

2. ManagedType 类:

    ManagedType.h

   

#pragma

once 

 

using

namespace System;

 

public ref

class ManagedType

 

 

 

{

 

 

public:

 

 

        ManagedType(void);

        ManagedType(String^ Name);

        void SetName(String^ name );

        String^ GetName();

private:

        String^ m_Name;

};

  

 

namespace

Init

 

{

 

 

 

    public ref class InitUtils

 

 

 

 

 

 

   {

  public:

 

 

 

      void static InitSystemStaticManagedType(String^ name);

 

 

 

      static ManagedType^ SystemStaticManagedType ;

 

 

 

 

   };

}//end namespace

 

 

 

 

    ManagedType.cpp

   

 

#include

"StdAfx.h" 

#include

"ManagedType.h" 

 

  

ManagedType

::ManagedType(void)

{

}

 

 

ManagedType

::ManagedType(String^ Name)

{   

 

    m_Name = Name;

}

 

 

void

ManagedType::SetName(String^ name )

{    

 

    m_Name = name;

 

String

^ ManagedType::GetName()

{

 

 

    return m_Name;

}

 

 

namespace

Init 

{

 

 

 

     void InitUtils::InitSystemStaticManagedType(String^ name)  

     {

         SystemStaticManagedType = gcnew ManagedType( name);

       }

}//end namespace

 

 

 

3. NativeTypeImp类

     NativeTypeImp.h

 

#pragma

once

#include

<vcclr.h> 

#include

<iostream> 

#include

"ManagedType.h"

 

 

using

namespace std;

class

NativeTypeImp

{

public

: 

      NativeTypeImp(ManagedType^ managedType);

 

 

      ~NativeTypeImp(void);

         wstring getName(); 

      static NativeTypeImp* getSystemStaticNativeImpType();

 

private

: 

       wstring m_Name;

 

 

       gcroot<ManagedType^> m_ManagedType;

};

 

  

     NativeTypeImp.cpp

  

 

#include

"StdAfx.h" 

#include

"NativeTypeImp.h" 

#include

<vcclr.h> 

#include

"ManagedType.h"

  

//#pragma unmanaged will lead to error

 

 

NativeTypeImp

::NativeTypeImp(ManagedType^ managedType)

{

 

 

      m_ManagedType = managedType;

}

 

 

NativeTypeImp

::~NativeTypeImp(void)

{

}

 

 

NativeTypeImp

* NativeTypeImp::getSystemStaticNativeImpType()

{   

 

   NativeTypeImp* imp = new       NativeTypeImpInit::InitUtils::SystemStaticManagedType );

 

 

    return imp;

}

 

 

wstring

NativeTypeImp::getName()

{

 

 

 

    if( m_Name.empty() ) 

    {

 

 

 

        ManagedType^ type = (ManagedType^) m_ManagedType;

         pin_ptr<const wchar_t> wch = PtrToStringChars( type->GetName() ); 

 

 

        m_Name = wch; 

      } 

 

 

      return m_Name;

}

 

 

 

 

3. NativeType类

    NativeType.h 

 

#pragma

once

 

 

 

 

 

 

 

 

 

 

//#include "NativeTypeImp.h"

#include

<iostream>

using

namespace std;

class

NativeTypeImp;

class

NativeType

{

 

public

:

 

 

       __declspec(dllimport) NativeType();

 

 

       __declspec(dllimport) ~NativeType();

 

 

       __declspec(dllimport) wstring getName();

private

:

       NativeTypeImp *m_imp;

};

 

    NativeType.cpp

 

#include

"StdAfx.h"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#include

"NativeType.h"

#include

"NativeTypeImp.h"

#pragma

unmanaged

NativeType

::NativeType()

{

   

m_imp = NULL;

 

 

    m_imp = NativeTypeImp::getSystemStaticNativeImpType();

}

 

NativeType

::~NativeType()

{

   

delete m_imp;

}

wstring

NativeType::getName()

{

   

if( m_imp != NULL )

 

 

    {

       return m_imp->getName();

     }

     else

       return NULL;

}