2012-04-04 146 views
5

使用C#性能我們有一個大的項目主要是寫在C#(服務,多線程等)。但是,核心數字運算算法是用非託管C++寫成的(OpenMP等)。在非託管C++代碼

不幸的是,目前我們要做很多的努力來交換這兩個世界之間的數據。也就是說,我們必須爲每個C++類在C++/CLI中編寫包裝類。對於(幾乎)在C# - 「world」中的任何必需設置(屬性),C++世界中存在一個副本(頭文件),並在包裝​​類中來回顯式轉換。這種體系結構看起來非常低效且相當容易出錯。

主要問題: 有沒有辦法在非託管C++中以某種方式自動共享C#類的屬性? (我們必須讀寫!)

第二個問題: 您是否可以就上述情況提供如何改善架構的建議。我們的一個考慮是完全切換到C++,但必須找到合適的庫併爲我們在.NET中執行的所有(系統)事情編寫乾淨的代碼,這一點感覺不好。

您的幫助和問候, 雅各布非常感謝

+0

您是否已經驗證,在C#編寫的算法是一個瓶頸? C#4.0現在對並行開發有很好的支持。 – Nick 2012-04-04 13:25:43

+0

不,我們還沒有這樣做,你說得對:我們應該嘗試確保這一點。但是由於我們依賴於內存緩存等特殊屬性,我真的懷疑算法會在CLR中以相似的速度運行。 – 2012-04-04 13:32:31

+2

[Protocol Buffers](http://code.google.com/p/protobuf/)怎麼樣?有能力與c#一起使用[protobuf-net](http://code.google.com/p/protobuf-net/)。 – megabyte1024 2012-04-04 13:35:04

回答

1

我處理我的工作類似的問題在我的首要任務是編寫託管接口,某些高perfromance,低延遲的dll,這涉及到簡單的情況下,其中I必須包裝使用簡單的C++含有原始指針到本機類或更復雜的問題,其中所述本機代碼是一個服務器端發佈者和託管代碼具有訂閱使用委託到/ CLI中的本地類,即它們必須是轉換爲本地回調。據我所知,底層.NET是一個複雜的COM服務器。可以使用將ComVisible屬性設置爲true編寫.net程序集,然後將其作爲傳統的COM組件,然後可以將其從本地C++代碼用作COM組件。使用DllImport屬性可以實現使用本機代碼的相反方式,並且可以通過各種屬性(如StructLayoutAttribute(http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx)和MarshalAsAttribute(http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute.aspx) )對所有Marshaling進行微調,我也有時使用不安全的關鍵字以及。我必須處理高性能的代碼,所以在某些情況下,在分析後我知道哪個是最好的解決方案。無論是你剛纔提到的warpper級的解決方案或傳統的COM方式,或某種混合的一些緩存,對象池等

希望有所幫助。 :)

道歉,如果這看起來有點雜亂無章。這裏很晚。 :)

+0

感謝您的回答 - 我已經使用Marhsal.StructToPtr和同伴清理了很多包裝代碼,並且希望通過在C#和本機C++世界中使用C++/CLI組件來實現更遠... – 2012-04-16 20:17:07

+0

謝謝Jakob S. – ervinbosenbacher 2012-04-17 01:20:11