簡體   English   中英

在C#中使用本機C ++代碼-std :: vector問題

[英]Using native c++ code in c# - problem with std::vector

我想在托管C#代碼中使用dll中的本機c ++函數。 但是我的函數采用了像std :: vector&這樣的參數-一個矢量引用...如何在dllimport語句中實現此參數? 我知道例如有IntPtr等,但是std :: vector <>將會是什么呢?

我將導出包裝所需功能的“ C”功能,然后從C#中調用/調用它們。 這樣的“ C”函數可以將std::vector<>數據公開為指針和數據緩沖區的大小。

假設您在Buffer類中具有std::vector<byte_t>

class Buffer
{
public:
    const std::vector<byte_t>& GetData() const { return data_; }

private:
    std::vector<byte_t> data_;
};

然后,您可以導出“ C”函數以適當地限制要使用的Buffer范圍:

Buffer* CreateBuffer();

您可能想在本機端做一些用數據填充std::vector<byte_t>

void DoSomethingThatProduceData(Buffer* buffer);

然后,您可以讀取該數據:

void GetBufferData(const Buffer* buffer, const byte_t** data, int* size);

最后,清理:

void DestroyBuffer(Buffer* buffer);

將這些“ C”聲明轉換為在C#側的P / Invoke聲明:

[DllImport("YourBufferLib.dll")]
static extern IntPtr CreateBuffer();

[DllImport("YourBufferLib.dll")]
static extern void DoSomethingThatProduceData(IntPtr buffer);

[DllImport("YourBufferLib.dll")]
static extern void GetBufferData(IntPtr buffer, out IntPtr data, out Int32 size);

[DllImport("YourBufferLib.dll")]
static extern void DestroyBuffer(IntPtr buffer);

最好將這些調用包裝在IDisposable類中的受管端,以確保正確清理本機資源。

[“ C”函數的實現細節,盡管有些瑣碎,顯然是留給讀者的練習。]

STL向量是非托管模板化方法。 從理論上講,您可以計算向量的相應方法的偏移量,然后執行一些代碼生成並將其調用。 您不能使用DllImport,因為STL向量是僅模板的庫,不是導出的方法。 您當然可以編寫C樣式包裝器來調用特定的方法,例如

int GetSize(vector<xxx> *vec)
{
    return vec.size();
}

但是您不想這樣做,因為為此需要進行許多托管的無人管理的轉換,這會使您的應用程序突然停止。 如果您需要操縱stl向量,那么最好的選擇是使用托管C ++,然后從C#調用托管C ++ dll來隨意操縱向量。 在許多公司中,由於人們不注意托管非托管過渡的成本,而托管C ++的使用確實導致其失去了主要資產:速度,因此人們禁止使用托管C ++。

您的Alois Kraus

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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