Добавить спутниковую сборку на предварительно скомпилированном развернутом веб-сайте

Для того, чтобы использовать GetGlobalResourceObject() в Visual Studio 2008 мне нужно скопировать файл.resx в папку App_GlobalResources Visual Studio. После предварительной компиляции приложения файлы ресурсов компилируются в соответствующие сателлитные сборки и развертываются под \bin\ папка по названиям культур. Это все отлично работает.

Однако я не могу добавить новые спутниковые сборки после предварительной компиляции приложения. То, что я сделал, было:

  1. Создана сателлитная сборка:

    resgen resources.applicationresources.es-ES.resx resources.applicationresources.es-ES.resources al / t: lib / culture: es-ES /embed:resources.applicationresources.es-ES.resources /out:App_GlobalResources.resources.dll

  2. Созданная папка \bin\es-ES\ и развернул там файл.dll.

К сожалению, недавно добавленная спутниковая сборка не распознается GetGlobalResourceObject(), который возвращается к ресурсу по умолчанию (на английском языке). Кажется, в файле ресурсов нет ничего плохого, потому что если я скопирую тот же файл.resx в App_GlobalResources а затем скомпилировать приложение, все работает просто отлично.

Что мне не хватает? Кстати, мой тип проекта - веб-сайт, а не проект веб-приложения.

2 ответа

Решение

(Из комментария @ksa)

Одна вещь, которая может пойти не так, это неверный путь к пространству имен в DLL, созданной resgen, вы можете использовать ILDASM или Reflector для сравнения пространств имен в рабочих DLL и сгенерированных не работающих DLLS. Затем вы можете изменить командную строку resgen для генерации с правильным пространством имен.

Попробуйте подключиться к событию AssemblyResolve в AppDomain.CurrentDomain и посмотреть, действительно ли он ищет сборку. Если он все же ищет, все, что вам нужно сделать, это сохранить список динамически загружаемых сборок и их пути.

Одно замечание о AssemblyResolve: если у вас нет сборки, верните null. Это поведение по умолчанию.

Другие вопросы по тегам