.NET DLL и потоки / отдельные экземпляры - PullRequest
1 голос
/ 04 сентября 2010

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 04 сентября 2010

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

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

0 голосов
/ 09 сентября 2010

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

...