CLI指向非托管C ++代码的指针

时间:2012-08-18 17:54:12

标签: c# c++ wrapper command-line-interface

我正在研究我的第一个C ++ / CLI包装器,并且我的指针变得非常混乱。在我得到的特定项目中,我试图包装一个非托管的C ++ DLL,以便我可以在C#应用程序中使用它。这里有两个目标:(1)能够在我的应用程序中使用库,以及(2)学习如何操作。在这个网站上搜索了很多个小时,谷歌已经收到了大量的答案;我似乎无法一路走到那里。我试图合并的非托管库是键值存储“LevelDB”(我知道至少有一个.NET包装器,但就像我说的那样,我正在尝试学习这个)。

以下代码是CLI包装器类的开头,就像在非托管代码中一样。 I.e。从功能上讲,这正是我想要实现的目标。毫不奇怪,这会产生以下编译器错误:

cannot convert parameter 3 from 'cli::interior_ptr<Type>' to 'leveldb::DB **'

当我开始时,我天真地认为我可以/应该用固定指针替换DB *指针,类似

pin_ptr<leveldb::DB*> db

但这会产生类似的错误,但不起作用。内部指针和句柄的其他组合(如果我理解的话,这里不适用,因为库是不受管理的)也没有用。我很感激任何建议指向我正确的方向。任何好的帖子/文章的参考也会很棒,但请在如何适应我的案例中加入一两个字,因为在阅读了大量文章之后,我似乎并没有更接近。谢谢!

示例包装类:

#pragma once
#include "leveldb/db.h"

using namespace System;

namespace Wrapper
{
    public ref class DBWrapper 
    {
        leveldb::DB* db;

    public:
        DBWrapper()
        {
            leveldb::Options options;
            options.create_if_missing = true;
            leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
        }

        ~DBWrapper() 
        {
            delete db;
        }
    };
}

1 个答案:

答案 0 :(得分:4)

使用局部变量:

DBWrapper()
{
    leveldb::Options options;
    options.create_if_missing = true;

    leveldb::DB* local_db(nullptr);
    leveldb::Status status =leveldb::DB::Open(options, "/tmp/testdb", &local_db);
    db = local_db;
}

正在构造的对象(由this指向)可以被垃圾回收器移动,因此成员变量没有固定的地址。

相关问题