这是一个实现了native c++ code和mananged c++ code以及c# code相互调用的例子。
首先用visual studio 2005创建一个clr支持的project,选择目生成为dll,创建两个类,一个是native的,一个是托管的。
//
UnManaged.h
namespace USharedLib
... {
class CUnmanaged
...{
public:
CUnmanaged(void);
void AddNumber(int number);
int GetTheResult();
private:
int m_Total;
};
}
namespace USharedLib
... {
class CUnmanaged
...{
public:
CUnmanaged(void);
void AddNumber(int number);
int GetTheResult();
private:
int m_Total;
};
}
//
UnManaged.cpp
#include " UnManaged.h "
namespace USharedLib
... {
CUnmanaged::CUnmanaged(void)
...{
m_Total = 0;
}
//add to the internal integer
void CUnmanaged::AddNumber(int number)
...{
m_Total += number;
}
//retrieve the current total
int CUnmanaged::GetTheResult()
...{
return m_Total;
}
}
#include " UnManaged.h "
namespace USharedLib
... {
CUnmanaged::CUnmanaged(void)
...{
m_Total = 0;
}
//add to the internal integer
void CUnmanaged::AddNumber(int number)
...{
m_Total += number;
}
//retrieve the current total
int CUnmanaged::GetTheResult()
...{
return m_Total;
}
}
然后是托管的c++ code,调用native c++的code。
//
Managed.h
#include " UnManaged.h "
using namespace System;
namespace MClassLib
... {
//a managed wrapper for an unmanaged C++ class
public ref class Managed
...{
public:
Managed(void);
~Managed(void);
int AddTheNumbers(int numA, int numB);
private:
//pointer to the unmanaged object
USharedLib::CUnmanaged* m_pUnmanagedObj;
};
}
#include " UnManaged.h "
using namespace System;
namespace MClassLib
... {
//a managed wrapper for an unmanaged C++ class
public ref class Managed
...{
public:
Managed(void);
~Managed(void);
int AddTheNumbers(int numA, int numB);
private:
//pointer to the unmanaged object
USharedLib::CUnmanaged* m_pUnmanagedObj;
};
}
对应的cpp文件:
//
Managed.cpp
#include " Managed.h "
#define NULL 0
namespace MClassLib
... {
Managed::Managed(void)
...{
//create an instance of the unmanaged class
m_pUnmanagedObj
= new USharedLib::CUnmanaged();
}
Managed::~Managed(void)
...{
//delete the unmanaged memory we allocated
delete m_pUnmanagedObj;
m_pUnmanagedObj = NULL;
}
int Managed::AddTheNumbers(int numA, int numB)
...{
//call the methods of the unmanaged object
m_pUnmanagedObj->AddNumber(numA);
m_pUnmanagedObj->AddNumber(numB);
return m_pUnmanagedObj->GetTheResult();
}
}
#include " Managed.h "
#define NULL 0
namespace MClassLib
... {
Managed::Managed(void)
...{
//create an instance of the unmanaged class
m_pUnmanagedObj
= new USharedLib::CUnmanaged();
}
Managed::~Managed(void)
...{
//delete the unmanaged memory we allocated
delete m_pUnmanagedObj;
m_pUnmanagedObj = NULL;
}
int Managed::AddTheNumbers(int numA, int numB)
...{
//call the methods of the unmanaged object
m_pUnmanagedObj->AddNumber(numA);
m_pUnmanagedObj->AddNumber(numB);
return m_pUnmanagedObj->GetTheResult();
}
}
然后新建一个c#的project,别忘了添加引用到刚才的c++ project,然后创建一个c# 文件如下:
using
System;
using System.Collections.Generic;
using System.Text;
using MClassLib;
namespace Test
... {
class Test
...{
static void Main(string[] args)
...{
Managed obj = new Managed();
int result = obj.AddTheNumbers(1, 2);
Console.WriteLine("AddTheNumbers result: {0}", result);
}
}
}
using System.Collections.Generic;
using System.Text;
using MClassLib;
namespace Test
... {
class Test
...{
static void Main(string[] args)
...{
Managed obj = new Managed();
int result = obj.AddTheNumbers(1, 2);
Console.WriteLine("AddTheNumbers result: {0}", result);
}
}
}
c# code 调用托管的c++ code。