簡體   English   中英

CLI指針指向非托管C ++代碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM