我正在开发我的第一个 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;
}
};
}