2009-12-24 48 views

回答

6

P/Invoke has an overhead of about 10-30 x86 instructions per call.這有多重要取決於你跨越邊界的頻率以及你在另一邊花了多少時間。例如,如果您的計算需要運行10微秒,那麼與計算成本相比,額外的10-30條指令將是微不足道的。如果你的計算是微不足道的,並且被稱爲很多,那麼開銷可能足夠重要,以便現在移植它,或者創建一個執行重複調用的非託管包裝函數(以便最小化跨越邊界的次數)。

主要缺點不是性能,而是信任要求。例如。如果您調用本機代碼,則無法從網絡驅動器或Intranet站點運行(至少在沒有其他配置的情況下),因爲這些源默認情況下比本地計算機更不受信任。

+0

好點。我沒有考慮信任問題。 – DenaliHardtail

+2

還有(旁邊)沒有希望它在單聲道(因此不同的平臺)上運行 – Earlz

+0

@Earlz爲什麼? Mono可以和P/Invoke很好地協作。他們甚至可以得到它的工作,否則(gtk,glib,...)?如果您的底層庫本身是跨平臺的,您可以在其他平臺上將它與Mono一起使用(libabc.so將用於替代abc.dll)。 – Yury

1

另一點值得注意的是,非託管代碼將在一個進程中的所有AppDomain之間共享。如果您有一個包含多個AppDomain的進程(如ASP.NET工作進程),則相關。