.NET DLL и потоки/отдельные экземпляры

Предположим, у меня есть .NET dll с классом «B» и функцией «C».

Затем у меня есть многопоточная программа .NET, которая ссылается на dll.

Каждый поток создает экземпляр класса «B» и вызывает функцию «C». При создании экземпляра класс «B» размещает все свои собственные переменные в куче. Эти переменные используются функцией 'C'.

Создает ли это отдельный экземпляр класса (т.е. безопасно ли вызывать функцию «C» в каждом из потоков основной программы) или мне нужно как-то динамически загружать DLL.

(Другими словами, .NET DLL ведет себя как функция Win32 LoadLibrary (подсчет ссылок), где вы должны дать одной dll разные имена, а затем загрузить их, чтобы создать разные экземпляры.)


person Bob Jacobs    schedule 03.09.2010    source источник
comment
Вам нужна только безопасность потоков или вам нужны отдельные экземпляры всех статических переменных и т. д.?   -  person bdonlan    schedule 04.09.2010
comment
@bdonlan - мне нужны отдельные экземпляры всех статических переменных и т. д., а также безопасность потоков (возможно, они идут рука об руку).   -  person Bob Jacobs    schedule 04.09.2010


Ответы (2)


В .Net разрешение типов основано на имени сборки, а не бинарное имя. Таким образом, даже если вам удастся получить две копии вашей dll в памяти процесса, определение типа класса B будет одинаковым и будет использовать одни и те же экземпляры статических переменных.

Однако каждый из ваших потоков может загружать сборку в отдельный домен приложения, и в этом случае каждый домен приложения получает собственный экземпляр статических переменных. Недостатком будет то, что ваш код будет пересекать границу домена приложения каждый раз, когда он вызывает метод C.

person Franci Penov    schedule 03.09.2010
comment
Спасибо за ответ Франси. Итак, если класс dll «B» имеет общедоступную переменную «A», то все экземпляры класса будут использовать переменную «A», а не их собственную копию, это правильно? - person Bob Jacobs; 04.09.2010

Возможно, вы ищете локальное хранилище потока, используйте ThreadStatic в ваших полях, если это то, что вам нужно.

person Ian Ringrose    schedule 09.09.2010