從C#應用程序調用本地庫中的函數有什麼缺點?我可以期待什麼樣的表現受到影響?這些功能是基本的工程計算,並沒有太複雜。我們有一天可以用C#重寫它們。從託管C#應用程序中調用非託管代碼的缺點
1
A
回答
6
P/Invoke has an overhead of about 10-30 x86 instructions per call.這有多重要取決於你跨越邊界的頻率以及你在另一邊花了多少時間。例如,如果您的計算需要運行10微秒,那麼與計算成本相比,額外的10-30條指令將是微不足道的。如果你的計算是微不足道的,並且被稱爲很多,那麼開銷可能足夠重要,以便現在移植它,或者創建一個執行重複調用的非託管包裝函數(以便最小化跨越邊界的次數)。
主要缺點不是性能,而是信任要求。例如。如果您調用本機代碼,則無法從網絡驅動器或Intranet站點運行(至少在沒有其他配置的情況下),因爲這些源默認情況下比本地計算機更不受信任。
1
另一點值得注意的是,非託管代碼將在一個進程中的所有AppDomain之間共享。如果您有一個包含多個AppDomain的進程(如ASP.NET工作進程),則相關。
相關問題
- 1. C++ cli從非託管代碼調用託管代碼
- 2. 調試託管的.NET代碼從非託管C++調用
- 3. 從託管代碼調用非託管代碼的性能
- 4. 我如何從託管代碼調用外部非託管應用程序?
- 5. 從託管代碼調用非託管代碼
- 6. 從非託管代碼調用託管代碼
- 7. 從託管或產卵過程調用非託管代碼
- 8. C#調用非託管代碼
- 9. 託管代碼與非託管代碼
- 10. 從託管代碼調用非託管DLL函數時出錯
- 11. 從非託管調用託管代碼時發生StackoverflowException
- 12. 調用從託管代碼非託管方法
- 13. 從託管代碼引用非託管圖書館,輔助和缺點?
- 14. 從非託管C++調用託管代碼(c#)的最佳方法
- 15. 從非託管win32程序集DLL調用託管代碼 - 崩潰
- 16. 如何使用託管代碼從非託管代碼?
- 17. 從Visual C++中的非託管代碼更新託管窗體
- 18. 卡住調用從非託管C++調用託管CLI方法
- 19. 使用託管代碼中的非託管代碼
- 20. 在調試託管代碼時調試非託管代碼
- 21. 從非託管代碼調用託管.NET代碼的最佳方式
- 22. 在非託管C++代碼
- 23. 非託管代碼調用回調vb.net
- 24. 託管C#中的自由非託管C代碼內存
- 25. 在混合C++ .NET應用程序中強調託管還是非託管?
- 26. 從非託管C++調用託管c#功能
- 27. 如何從託管C++ exe調用非託管C++ exe
- 28. 託管代碼和非託管代碼之間的調用代碼
- 29. C#託管的dll調用或非託管的dll調用?
- 30. 使用COM互操作從非託管代碼調用託管代理
好點。我沒有考慮信任問題。 – DenaliHardtail
還有(旁邊)沒有希望它在單聲道(因此不同的平臺)上運行 – Earlz
@Earlz爲什麼? Mono可以和P/Invoke很好地協作。他們甚至可以得到它的工作,否則(gtk,glib,...)?如果您的底層庫本身是跨平臺的,您可以在其他平臺上將它與Mono一起使用(libabc.so將用於替代abc.dll)。 – Yury