2011-11-03 34 views
1

我有一個C庫是而不是線程安全 - 並且可能永遠不會。我使用PInvoke從C#中調用它,這個工作非常好。.Net AppDomains是否提供針對流氓C庫的保護?

既然C庫必須從C#程序中調用,那肯定是多線程的。我可以通過從不同的AppDomain中調用C代碼的每個實例來管理C#中的這些內容,除非這看起來效果不好。我仍然在C庫中遇到很多交叉線程問題。

AppDomains是否將C代碼混淆(全局變量等)隔離或不相容?如果不是,將會怎樣?

+0

是否有可能在C/C++中多次加載庫,方法是複製原始數據並再次動態加載它?廉價但有效的方式! – noelicus

+0

不。看起來,在同一進程中加載​​的本機代碼 - 無論是何種方法 - 共享內存空間。這一切都必須完全在另一個過程中。 –

回答

5

不,AppDomain不會幫助。如果您同時調用您的C庫,調用來自哪個AppDomain並不重要。

如果C庫不是線程安全的,則必須對其進行序列化訪問。實際上,擁有多個AppDomain會讓這個問題變得更加棘手 - 您必須跨域進行同步。

1

我認爲AppDomains是一種只隔離託管代碼的構造。

您必須使用可用的c#/ .NET同步原語(例如,使用lock塊)來同步對c lib的訪問。

1

如果您在C庫中有全局/共享變量,並且需要隔離這些變量,則必須啓動單獨的進程。