2009-05-19 154 views
0

我有一個非託管C++ EXE,我可以從我的C#代碼直接調用(具有C++代碼,我可以做一個庫)或通過產生一個進程,並從數據抓取的OutputStream。這些選項的優點和缺點是什麼?從託管或產卵過程調用非託管代碼

回答

0

刮掉OutputStream的一個很大的缺點是缺少數據類型。我寧願做出導出一些函數和重用現有庫的工作;但是,這只是一種偏好。

0

產生一個過程的另一個缺點是,在一個窗口中,一個過程是一個非常昂貴(慢)的操作。如果你打算經常調用C++代碼,這是值得考慮的。 一個優勢可能是,你自動更加孤立於C++程序中的崩潰。 更換C++可執行文件也是一個優點。 此外寫入interop代碼可以在c#中很麻煩。如果它是一個複雜的interace,並且您決定進行互操作,請查看interop層的C++/cli。

0

你最好將C++可執行文件的一部分功能集成到一個庫中。您將保持類型安全性,並且您將能夠更好地利用異常處理(更不用說更好地控制如何將調用管理到庫中的函數中)。

如果您從可執行文件的OutputStream中獲取數據,您將無法看到可執行文件的進程,沒有真正的異常處理,並且您將丟失任何可能的類型信息有過。

1

由於您擁有C++庫的源代碼,因此可以使用C++/CLI將其編譯爲混合模式DLL,因此C#應用程序很容易使用它。

這樣做的好處是在數據流(輸入或輸出到該C++模塊)上最爲靈活。

從進程中運行C++代碼有一個好處。如果你的C++代碼不是很健壯的話,這可以使你的主C#進程保持穩定,以免被C++代碼崩潰。

0

在過程中的主要缺點是確保您正確處理託管/本地交互。

1)

C++代碼可能會依賴於確定性的破壞進行清理/資源釋放等我說可能是因爲這是在C常見和良好做法++。

在託管代碼中,這意味着您必須謹慎處理您的C++ cli包裝代碼。如果你的代碼只用了一次,c#中的using子句會爲你做這件事。如果對象需要一段時間作爲成員,你會發現這個處理器需要通過你的應用程序進行鏈接。

2)

另一個問題取決於你的應用程序如何內存飢。託管垃圾收集器可能很懶。如果託管分配需要比可用空間更多的空間,則保證能夠啓動。然而,非託管分配器無論如何都沒有連接。因此,您需要手動通知託管分配器您將進行非託管分配,並且應該保持該空間可用。這是使用AddMemoryPressure方法完成的。

退出的主要缺點是:

1)速度。

2)管理通信的代碼開銷。

3)代碼開銷監視一個或其他進程在不期望時死亡。