Добавить спутниковую сборку на предварительно скомпилированном развернутом веб-сайте
Для того, чтобы использовать GetGlobalResourceObject()
в Visual Studio 2008 мне нужно скопировать файл.resx в папку App_GlobalResources Visual Studio. После предварительной компиляции приложения файлы ресурсов компилируются в соответствующие сателлитные сборки и развертываются под \bin\
папка по названиям культур. Это все отлично работает.
Однако я не могу добавить новые спутниковые сборки после предварительной компиляции приложения. То, что я сделал, было:
Создана сателлитная сборка:
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
Созданная папка
\bin\es-ES\
и развернул там файл.dll.
К сожалению, недавно добавленная спутниковая сборка не распознается GetGlobalResourceObject()
, который возвращается к ресурсу по умолчанию (на английском языке). Кажется, в файле ресурсов нет ничего плохого, потому что если я скопирую тот же файл.resx в App_GlobalResources
а затем скомпилировать приложение, все работает просто отлично.
Что мне не хватает? Кстати, мой тип проекта - веб-сайт, а не проект веб-приложения.
2 ответа
(Из комментария @ksa)
Одна вещь, которая может пойти не так, это неверный путь к пространству имен в DLL, созданной resgen, вы можете использовать ILDASM или Reflector для сравнения пространств имен в рабочих DLL и сгенерированных не работающих DLLS. Затем вы можете изменить командную строку resgen для генерации с правильным пространством имен.
Попробуйте подключиться к событию AssemblyResolve в AppDomain.CurrentDomain и посмотреть, действительно ли он ищет сборку. Если он все же ищет, все, что вам нужно сделать, это сохранить список динамически загружаемых сборок и их пути.
Одно замечание о AssemblyResolve: если у вас нет сборки, верните null. Это поведение по умолчанию.