我有一个本机C ++ DLL,我想为其提供C ++ / CLI包装器层。据我了解,如果您简单地向项目中添加C ++ / CLI类,则VS会以混合模式进行编译,但是我显然是错的,因为VS似乎甚至没有接触托管代码。
因此,给定一个预先存在的本机代码库,您究竟需要一步一步地创建一个混合模式DLL,以便我可以从任何.NET语言链接到该代码中吗?
*我需要这样做,因为我的本机代码使用了无法P / Invoke的C ++类。
最佳答案
好吧,不,直到您告诉C ++ / CLI编译器您的旧版DLL是用非托管代码编写的,它才能成为混合模式。应该注意到的是,应该从非托管DLL导出中获得链接器错误。您需要使用#pragmamanaged:
#pragma managed(push, off)
#include "oldskool.h"
#pragma comment(lib, "oldskool.lib")
#pragma managed(pop)
using namespace System;
public ref class Wrapper {
private:
COldSkool* pUnmanaged;
public:
Wrapper() { pUnmanaged = new COldSkool; }
~Wrapper() { delete pUnmanaged; pUnmanaged = 0; }
!Wrapper() { delete pUnmanaged; }
void sampleMethod() {
if (!pUnmanaged) throw gcnew ObjectDisposedException("Wrapper");
pUnmanaged->sampleMethod();
}
};