我正在研究我的第一个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;
}
};
}
答案 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
指向)可以被垃圾回收器移动,因此成员变量没有固定的地址。