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;
classNativeType
{
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;
}