2010-09-03 83 views
1

假設我有一個類'B'和函數'C'的.NET DLL。.NET DLL和線程/不同的實例

然後我有一個多線程的.NET程序引用該DLL。

每個線程實例化類「B」並調用函數「C」。實例化後,類「B」在堆上分配它自己的所有變量。這些變量由函數'C'使用。

這是否創建了一個不同的類實例(即在主程序的每個線程中調用函數'C'是否安全),還是我必須以某種方式動態加載DLL。

(換句話說,它在.NET的DLL行爲像Win32的LoadLibrary函數(引用計數),在那裏你必須給一個DLL不同的名稱,然後加載這些,創造不同實例。)

+0

你只需要線程安全,還是需要所有靜態變量的不同實例等? – bdonlan 2010-09-03 23:01:08

+0

@bdonlan - 我需要所有靜態變量等的不同實例,以及線程安全性(也許它們齊頭並進)。 – 2010-09-03 23:06:03

回答

1

在.Net,類型分辨率基於assembly name,而不是二進制名稱。因此,即使你設法在進程內存中獲得你的dll的兩個副本,類B的類型定義也將是相同的,並且將使用相同的靜態變量實例。

但是,每個線程都可以將程序集加載到單獨的appdomain中,在這種情況下,每個appdomain都會獲得自己的靜態變量實例。缺點是每次調用方法C時,您的代碼都會跨越應用程序域邊界。

+0

感謝Franci的回覆。因此,如果dll類'B'具有公共變量'A',那麼該類的所有實例將使用變量'A',而不是它們自己的副本,這是否正確? – 2010-09-04 00:03:07

+0

僅當該變量被標記爲靜態時。 – 2010-09-04 06:53:47