我有一個C庫是而不是線程安全 - 並且可能永遠不會。我使用PInvoke從C#中調用它,這個工作非常好。.Net AppDomains是否提供針對流氓C庫的保護?
既然C庫必須從C#程序中調用,那肯定是多線程的。我可以通過從不同的AppDomain中調用C代碼的每個實例來管理C#中的這些內容,除非這看起來效果不好。我仍然在C庫中遇到很多交叉線程問題。
AppDomains是否將C代碼混淆(全局變量等)隔離或不相容?如果不是,將會怎樣?
我有一個C庫是而不是線程安全 - 並且可能永遠不會。我使用PInvoke從C#中調用它,這個工作非常好。.Net AppDomains是否提供針對流氓C庫的保護?
既然C庫必須從C#程序中調用,那肯定是多線程的。我可以通過從不同的AppDomain中調用C代碼的每個實例來管理C#中的這些內容,除非這看起來效果不好。我仍然在C庫中遇到很多交叉線程問題。
AppDomains是否將C代碼混淆(全局變量等)隔離或不相容?如果不是,將會怎樣?
不,AppDomain不會幫助。如果您同時調用您的C庫,調用來自哪個AppDomain並不重要。
如果C庫不是線程安全的,則必須對其進行序列化訪問。實際上,擁有多個AppDomain會讓這個問題變得更加棘手 - 您必須跨域進行同步。
我認爲AppDomains是一種只隔離託管代碼的構造。
您必須使用可用的c#/ .NET同步原語(例如,使用lock
塊)來同步對c lib的訪問。
如果您在C庫中有全局/共享變量,並且需要隔離這些變量,則必須啓動單獨的進程。
是否有可能在C/C++中多次加載庫,方法是複製原始數據並再次動態加載它?廉價但有效的方式! – noelicus
不。看起來,在同一進程中加載的本機代碼 - 無論是何種方法 - 共享內存空間。這一切都必須完全在另一個過程中。 –