我有一个本机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();
    }
};

09-06 18:45