Я отредактировал и урезал это, чтобы попытаться закрыть его, потому что сайт побуждает меня принять ответ или добавить вознаграждение.
Я провел эксперимент, в котором были вызовы GetUserStoreForAssembly и GetUserStoreForDomain в библиотеке, на которую ссылается консольное приложение, но я не понимал, почему я получаю больше магазинов, чем ожидалось, в одном случае и меньше в другом.
Преет помог мне настроить мой эксперимент, и я столкнулся с двумя немного разными проблемами:
когда я скопировал консольное приложение в другой каталог (таким образом, имя осталось прежним), я получил два хранилища пользователей / сборок, т.е. по одному на копию, когда ожидал, что они поделятся
когда я загружал свою библиотеку в несколько доменов в консольном приложении, они все еще использовали одно и то же хранилище пользователей / сборок / доменов, когда я ожидал, что они не поделятся
К тому времени вопрос был холодным. Я прочитал сам и подумал, что нашел ответы, поэтому сам ответил на вопрос, надеясь, что кто-нибудь подтвердит / исправит. Но это было так далеко внизу списка не было никаких шансов. Я просто собирался оставить его, но затем мне предложили принять или добавить вознаграждение.
Итак, я переместил свой ответ сюда, и теперь мне просто нужен кто-то, чтобы добавить полезный комментарий, подтверждающий или исправляющий, чтобы я мог принять его и знать, что на самом деле это будет полезно всем, кто хочет лучше понять изолированное хранилище:
Возможный ответ на первый вопрос:
Сборки со строгими именами, конечно же, идентифицируются по их строгим именам. Слабо названные (не уверен, что это официальный термин, но какой-либо другой) идентифицируются по их URL или местонахождению файла. Таким образом, то же имя со слабым именем, скопированное в другой каталог, будет иметь свое отдельное изолированное хранилище.
Возможен ответ на второй вопрос (менее уверенный в этом вопросе):
Область, возвращаемая GetUserStoreForDomain, ограничена машиной, пользователем, приложением и сборкой, особенно той сборкой, которая выполняется в конкретном приложении.
Мой эксперимент создал несколько дополнительных доменов, но все они находятся в одном приложении. Поэтому все они используют одно и то же хранилище доменов.
Поэтому, чтобы имитировать изоляцию домена, мне нужно ссылаться на библиотеку из двух разных консольных приложений.
И это будет работать правильно, только если библиотека (и, следовательно, оба консольных приложения) имеют строгое имя. Ссылка на сборку приводит к тому, что она копируется, что означает, что если она имеет слабое имя, у нее будет отдельное хранилище изоляции.
Я только что проверил весь эксперимент с сильными именами. Теперь я получил 2 хранилища доменов и 1 хранилище сборок, как и ожидалось.