2011-02-07 43 views
5

我想從託管的c#代碼中使用我的本地C++函數從dll。 但我的函數採用像std :: vector &這樣的參數 - 向量引用... 如何在dllimport語句中實現這個參數?我知道例如,有IntPtr等,但什麼是std :: vector <>?在c#中使用本機c + +代碼 - 與std :: vector的問題

+1

這可能將是非常困難的,甚至是不可能的。你能否爲你的`C++`庫提供`C`接口並使用它? – ereOn 2011-02-07 09:01:31

回答

5

我會導出包含所需功能的「C」函數,並從C#中調用它們。這樣的「C」函數可以將數據作爲指針和數據緩衝區的大小進行公開。

例如說,你在一個類Bufferstd::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」 聲明以P/C#的側調用的:

[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」函數的實現細節顯然留給讀者作爲練習讀者。]

0

STL載體非託管模板的方法。從理論上講,你可以計算相應的矢量方法的偏移量,並進行一些代碼生成並調用它。您不能使用DllImport,因爲STL向量是僅包含模板的庫,它們不是導出的方法。當然,你可以寫一個C風格的包裝,以調用特定的方法,如

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

但你不想這樣做,因爲爲此所需的許多管理unmanged的轉變將帶來您的應用程序突然停止。如果您需要操縱stl向量,最好的辦法是使用託管C++並從C#調用Managed C++ dll來根據需要操縱向量。在許多公司中,Managed C++的使用被禁止,因爲人們沒有注意到託管非託管過渡的成本,這種過渡確實導致C++放棄其主要資產:速度。

你的, 阿洛伊斯·克勞斯