我想從託管的c#代碼中使用我的本地C++函數從dll。 但我的函數採用像std :: vector &這樣的參數 - 向量引用... 如何在dllimport語句中實現這個參數?我知道例如,有IntPtr等,但什麼是std :: vector <>?在c#中使用本機c + +代碼 - 與std :: vector的問題
5
A
回答
5
我會導出包含所需功能的「C」函數,並從C#中調用它們。這樣的「C」函數可以將數據作爲指針和數據緩衝區的大小進行公開。
例如說,你在一個類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」 聲明以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++放棄其主要資產:速度。
你的, 阿洛伊斯·克勞斯
相關問題
- 1. 問題與MPI_Gatherv爲std :: vector
- 2. sizeof()std :: vector(C++)
- 3. C++析構函數與類對象的std :: vector的問題
- 4. C++ std :: vector <std :: shared_ptr>
- 5. Prim的算法與std :: vector和std :: queue,我的代碼有什麼問題?
- 6. C++代碼問題
- 7. GraphicsMagick性能問題使用C++ Java本機代碼
- 8. 在C#代碼中使用C++ DLL函數的問題
- 9. matlab的isempty爲std :: vector(C++)
- 10. 使用C++測試浮點std :: vector Catch
- 11. 關於在C++中將數組存儲在std :: vector中的問題
- 12. 在C++中使用std :: vector的性能損失是多少?
- 13. OpenGL:使用VBO與std :: vector
- 14. 併發環境中的C++ 11 std :: vector
- 15. C++ std :: vector作爲std :: function的參數
- 16. C++ std :: map和std :: vector的優點?
- 17. 使用strcpy與std :: vector
- 18. 使用std :: lower_bound與std :: vector :: const_iterator
- 19. 使用軟件事務存儲器的C++ std :: vector訪問
- 20. C++ 11到C#代碼轉換問題
- 21. 在C++中分配本地std :: vector來引用
- 22. C++ std :: vector如何工作?
- 23. C++ std :: vector emplace vs insert
- 24. C#代碼中的Excel引用問題
- 25. Objective-C代碼中的潛在問題
- 26. 在C++中的異常機制問題
- 27. 你在XCode + C++中如何使用std :: vector?
- 28. 如何使用SWIG爲C++ std :: vector生成Lua迭代器?
- 29. std :: vector中的單個元素[C++]
- 30. 將fstreams加載到C++的std :: vector中
這可能將是非常困難的,甚至是不可能的。你能否爲你的`C++`庫提供`C`接口並使用它? – ereOn 2011-02-07 09:01:31