2013-06-27 80 views
2

我正在將我的解決方案從c#移動到C++。我已經創建了幾個原生C++ dll,他們很好。將原生dll連接到C++和c#都很容易。對於c#我使用P/Invoke方法執行和delegate回調,我只是傳遞指向非託管內存並使用Marshall類閱讀它。創建可以從c#和C++中使用的c#dll

現在我有相反的情況 - 我需要創建C#項目,現在從另一個C#項目中使用,但以後我會重寫主項目,C++,所以我需要從C訪問C#項目++。它應該只提供幾種方法:PlaceOrder(void* pointerToStruct)CancelOrder(void* pointerToStruct)和一個回調delegate OrderUpdated(void* pointerToStruct)

我正在尋找提示和示例。我怎樣才能創建C#項目,這將是可用的本地C + +和C#,並提供幾個方法+一個回調。

尤其是我現在不應該如何處理內存 - 我應該在c#上寫入非託管內存並從C++讀取它,還是應該在c#上寫入托管內存並以某種方式讀取C++中的託管內存。 。指向我在傳遞參數的結構應指向非託管內存或託管內存等

+0

幾乎可以創建DLL導出表(除非你做它在IL或託管C++);也許創建COM更容易? –

+0

COM是slooooow和複雜的,我正在寫低延遲軟件,它只是暫時的解決方案,所以我寧願簡單快捷的東西。 – javapowered

+0

我有c#部分,我不需要重寫到C++。因爲一旦移植到linux後我將把它扔掉。但直到我需要從C++使用c#。 – javapowered

回答

1

寫在C#DLL中的問題是,它不可能讓導出表(標記靜態方法作爲用於出口): 有DllImportAttribute但沒有DllExportAttribute在C#。雖然有兩種方式:

  1. 將dll(至少部分)寫在專門爲此設計的託管C++上。
  2. 在C#源代碼編譯之後更改生成的IL: http://winch.pinkbile.com/wiki/index.php/Main/Dlltool http://www.codeproject.com/Articles/37675/Simple-Method-of-DLL-Export-without-C-CLI

又見

Is is possible to export functions from a C# DLL like in VS C++?

+0

哪些選項具有更好的延遲?我應該在VS,C#「Class Library」中創建什麼類型的項目? – javapowered

+0

https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports呢? – javapowered

+0

這兩個選項都具有較低的延遲,IL稍好一些。 –