簡體   English   中英

如何調用接受來自 C# 的 stringstream 類型參數的 C++ DLL 函數?

[英]How can I call a function of a C++ DLL that accepts a parameter of type stringstream from C#?

我想導入一個非托管 C++ DLL 並調用一個將stringstream作為參數的函數。 在 C# 中,沒有stringstream類,所以誰能告訴我如何從 C# 程序中調用這樣的函數?

您不應該通過 DLL 公開模板化對象。

模板化對象(例如std::中的幾乎所有內容)變為內聯。 所以通過這種方式,您的 DLL 獲得了它自己的私有實現副本。 調用您的 DLL 的模塊還將獲得自己的stringstream私有實現。 在它們之間傳遞意味着您無意中將兩個不相關的實現編織在一起。 對於許多項目,如果您使用完全相同的構建設置,則可能沒有問題。

但即使您使用相同的編譯器,並將發布 DLL 與調試 EXE 混合使用,您也會發現堆棧/堆損壞和其他更難發現的問題。

那只是使用來自另一個非托管 C++ exe/dll 的 DLL。 越過線到 .NET 就更成問題了。

解決方案是將 DLL 的接口更改為可以跨 DLL 邊界友好播放的接口。 要么是 COM(例如,您可以使用IStream ),要么只是像 winapi 這樣的 C 風格接口。

如果可以修改 C++ dll,導出純字符串版本。 否則,您必須構建一個托管 C++ 包裝器項目,導入其他 C++ dll,將其導出為托管函數,然后從您的 C# 代碼中調用它。 C++ 互操作真的很糟糕。

恐怕您將不得不在 C# 中創建自己的StringStream類,以便能夠使用從該 DLL 導出的函數。 正如您所提到的,.NET Framework 不提供任何現成的類似類。

最簡單的方法可能是包裝 .NET Framework 提供的StringBuilder類,使其可以用作流。 有關進一步的解釋和一些示例代碼,請參閱此博客文章

MSDN 雜志也回答了類似的問題:http: //msdn.microsoft.com/en-us/magazine/cc163768.aspx 您可能會發現那里提供的一些提示和/或示例代碼很有用。

您正在嘗試將本機 C++ 代碼綁定到 C# 中的托管代碼。 一般來說,最好的方法是在托管 C++ 中引入中間層,該中間層將為來自 C# 的調用提供接口。

在 c 或 c++ 中創建一個 Wrapper dll,公開對該函數的友好調用。 這是更好的方法。

例如一個

BOOL getString(TCHAR * myreturnString, DWORD *size);

暫無
暫無

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

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