Итак, в завершение этого вопроса, вот что мы наконец сделали, чтобы полностью автоматизировать этот процесс.
Мы, как было предложено, использовали элемент ApplicationResourceFile в файле манифеста.
<?xml version="1.0" encoding="utf-8"?>
<Solution SolutionId="{185E973C-3A10-4e2a-9E0F-DC14414551F9}"
xmlns="http://schemas.microsoft.com/sharepoint/"
DeploymentServerType="WebFrontEnd">
<ApplicationResourceFiles>
<ApplicationResourceFile Location="yourappname.resx"/>
<ApplicationResourceFile Location="yourappname.en-US.resx"/>
</ApplicationResourceFiles> ...
</Solution>
Это фактически поместило файлы в папку "resources". Итак, мы просто получили доступ к ресурсам оттуда в коде так:
string appPath = HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath);
ResourceManager resX = ResourceManager.CreateFileBasedResourceManager("ResourceFileName", appPath + "resources", null);
SPSecurity.RunWithElevatedPrivileges(delegate()
{
AddResource(resX, "DefaultTextBoxLabelText");
Мы запускаем этот код в конструкторе и добавляем записи из файла ресурсов в локальный словарь. Вы должны использовать RunWithElevatedPrivileges, потому что новая созданная папка «ресурсы» доступна только для учетной записи AppPool.