![](/img/trans.png)
[英]Exposing C++ unmanaged code class pointers to C# with C++/CLI
[英]CLI pointers to unmanaged C++ code
我正在第一個C ++ / CLI包裝器上工作,並且得到了非常困惑的wrt指針。 在我擁有的特定項目中,我嘗試包裝非托管的C ++ dll,以便可以在C#應用程序中使用它。 這里有兩個目標:(1)能夠使用我的應用程序中的庫,以及(2)學習如何做到這一點。 在這個網站和Google上進行了許多小時的搜索后,得出的答案很接近。 我似乎無法一路走到那里。 我要合並的非托管庫是鍵值存儲“ 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;
}
};
}
使用局部變量:
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
指向),因此成員變量沒有固定的地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.