2010-09-03 3 views
1

Предположим, у меня есть .NET dll с классом 'B' и функцией 'C'..NET DLL и потоки/отдельные экземпляры

У меня тогда есть многопоточная .NET-программа, которая ссылается на DLL.

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

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

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

+0

Вам нужна только безопасность потоков, или вам нужны разные экземпляры всех статических переменных и т. Д.? – bdonlan

+0

@bdonlan - Мне нужны разные экземпляры всех статических переменных и т. Д., И безопасность потоков (возможно, они идут рука об руку). –

ответ

1

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

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

+0

Спасибо за ответ Франци. Итак, если класс dll «B» имеет общедоступную переменную «A», то все экземпляры класса будут использовать переменную «A», а не собственную копию, это правильно? –

+0

Только если эта переменная отмечена как статическая. –