2

我正在开发我的第一个 C++/CLI 包装器,并且对 wrt 指针感到非常困惑。在我拥有的特定项目中,我试图包装一个非托管 C++ dll,以便可以在 C# 应用程序中使用它。这里有两个目标:(1)能够在我的应用程序中使用该库,以及(2)学习这样做。在这个网站和谷歌上进行了数小时的搜索,得到了一堆接近的答案;我似乎无法一路走到那里。我试图合并的非托管库是键值存储“LevelDB”(我知道至少有一个 .NET 包装器,但就像我说的那样,我正在尝试学习这一点)。

下面的代码是 CLI 包装类的开头,就像用非托管代码一样编写。也就是说,这在功能上是我想要完成的。毫不奇怪,这会产生以下编译器错误:

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;
        }
    };
}
4

1 回答 1

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)可以被垃圾收集器移动,因此成员变量没有固定地址。

于 2012-08-18T18:37:50.537 回答