我有一個非託管C++ EXE,我可以從我的C#代碼直接調用(具有C++代碼,我可以做一個庫)或通過產生一個進程,並從數據抓取的OutputStream。這些選項的優點和缺點是什麼?從託管或產卵過程調用非託管代碼
回答
刮掉OutputStream的一個很大的缺點是缺少數據類型。我寧願做出導出一些函數和重用現有庫的工作;但是,這只是一種偏好。
產生一個過程的另一個缺點是,在一個窗口中,一個過程是一個非常昂貴(慢)的操作。如果你打算經常調用C++代碼,這是值得考慮的。 一個優勢可能是,你自動更加孤立於C++程序中的崩潰。 更換C++可執行文件也是一個優點。 此外寫入interop代碼可以在c#中很麻煩。如果它是一個複雜的interace,並且您決定進行互操作,請查看interop層的C++/cli。
你最好將C++可執行文件的一部分功能集成到一個庫中。您將保持類型安全性,並且您將能夠更好地利用異常處理(更不用說更好地控制如何將調用管理到庫中的函數中)。
如果您從可執行文件的OutputStream中獲取數據,您將無法看到可執行文件的進程,沒有真正的異常處理,並且您將丟失任何可能的類型信息有過。
由於您擁有C++庫的源代碼,因此可以使用C++/CLI將其編譯爲混合模式DLL,因此C#應用程序很容易使用它。
這樣做的好處是在數據流(輸入或輸出到該C++模塊)上最爲靈活。
從進程中運行C++代碼有一個好處。如果你的C++代碼不是很健壯的話,這可以使你的主C#進程保持穩定,以免被C++代碼崩潰。
在過程中的主要缺點是確保您正確處理託管/本地交互。
1)
C++代碼可能會依賴於確定性的破壞進行清理/資源釋放等我說可能是因爲這是在C常見和良好做法++。
在託管代碼中,這意味着您必須謹慎處理您的C++ cli包裝代碼。如果你的代碼只用了一次,c#中的using子句會爲你做這件事。如果對象需要一段時間作爲成員,你會發現這個處理器需要通過你的應用程序進行鏈接。
2)
另一個問題取決於你的應用程序如何內存飢。託管垃圾收集器可能很懶。如果託管分配需要比可用空間更多的空間,則保證能夠啓動。然而,非託管分配器無論如何都沒有連接。因此,您需要手動通知託管分配器您將進行非託管分配,並且應該保持該空間可用。這是使用AddMemoryPressure方法完成的。
退出的主要缺點是:
1)速度。
2)管理通信的代碼開銷。
3)代碼開銷監視一個或其他進程在不期望時死亡。
- 1. 從非託管代碼調用託管代碼
- 2. 從託管代碼調用非託管代碼的性能
- 3. 調試託管的.NET代碼從非託管C++調用
- 4. 託管代碼與非託管代碼
- 5. 在調試託管代碼時調試非託管代碼
- 6. 從託管代碼調用非託管DLL函數時出錯
- 7. 調用從託管代碼非託管方法
- 8. 從非託管調用託管代碼時發生StackoverflowException
- 9. 如何使用託管代碼從非託管代碼?
- 10. 調試託管代碼和非託管代碼
- 11. DirectX託管或非託管?
- 12. 託管代碼在非託管
- 13. 從非託管代碼
- 14. 通多 - 從託管代碼維數組非託管代碼
- 15. 我如何從託管代碼調用外部非託管應用程序?
- 16. 遠程調試非託管代碼
- 17. 非託管代碼調用回調vb.net
- 18. 託管代碼和非託管代碼之間的調用代碼
- 19. 使用COM互操作從非託管代碼調用託管代理
- 20. 使用託管代碼中的非託管代碼
- 21. C#託管的dll調用或非託管的dll調用?
- 22. C#調用非託管代碼
- 23. 將非託管轉換爲託管過程中的託管
- 24. WinDbg - 調試混合x64託管/非託管代碼
- 25. 將非託管C++代碼編譯爲託管代碼
- 26. 什麼是託管代碼和非託管代碼?
- 27. .NET中的託管代碼和非託管代碼
- 28. 更改託管代碼中非託管代碼的內存值
- 29. C++/cli將託管代碼傳遞給非託管代碼
- 30. 卡住調用從非託管C++調用託管CLI方法