мы работаем в Visual Studio 2017 и не хотим предоставить проект библиотеки классов C# с использованием .NET Framework 4.6.1 через nuget. Проблема в том, что в проекте используются файлы ресурсов.
Структура проекта такая:
MainLibClass обращается к ресурсам следующим образом:
using System.Threading;
using System.Globalization;
public class MainLibClass
{
...
public void SetCurrentThreadToCulture(string cultureName)
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureName);
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(cultureName);
}
public string foo()
{...
string resourceValue = Resource.ResourceManager.GetString(valueNodeName);
return resourceValue
}
}
Этот проект работает и протестирован для разных культур (en-US, de-DE, ...)
Затем я создал пакет nuget. Из консоли в папке с файлом ProjectFile.csproj я запустил:
nuget spec
nuget pack ProjectFile.csproj -IncludeReferencedProjects
или
nuget pack ProjectFile.csproj -IncludeReferencedProjects -symbols
Затем я создал небольшое тестовое консольное приложение (с использованием .NET Framework 4.6.1), в котором новый пакет nuget установлен правильно. Тестовое приложение делает что-то вроде:
MainLibClass reader = new MainLibClass();
reader.SetCurrentThreadToCulture("de-DE");//"en-US"
string resValTranslated = reader.foo();//Contains only Resource.resx data
Теперь перевод больше не работает! Кто-нибудь знает решение этой проблемы?
Могу ли я встроить ресурсы в nuget dll, или мне нужно реструктурировать nuget, или, или ... ???
Обновлено: Если я использую структуру nuget из статьи Руи Джаримбы, на которую ссылается Создание локализованных пакетов NuGet И если я включаю файлы resx для каждого языка рядом с каждой DLL, зависящей от языка, и если я устанавливаю культуру перед первым доступом к классу nuget, то это работает! Итак, если я изменю тестовое приложение на:
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
MainLibClass reader = new MainLibClass();
string resValTranslated = reader.foo();//Now it works!
Обновлено еще раз: Но этот подход работает только один раз! Если я сделаю :
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("en-US");
MainLibClass reader = new MainLibClass();
string resValTranslated = reader.foo();//Now it works!
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");
MainLibClass reader2 = new MainLibClass();
resValTranslated = reader2.foo();//Now it dont!
ИЗМЕНИТЬ 3 @Lasse Vågsæther Карлсен: Как я уже сказал в первом РЕДАКТИРОВАНИИ, файл nuget содержит в распакованном виде следующую структуру:
Как делал установку? Вы публиковали? Framework использует библиотеки DLL Windows, и если библиотеки DLL не совпадают на компьютерах для сборки и развертывания, этот код не будет работать одинаково. Публикация приложения гарантирует, что на машине развертывания установлены правильные библиотеки DLL.
@jdweng Я сделал это на своей машине
@Rui Jarimba, я просто попытался структурировать nuget, как в вашей упомянутой статье. Если я компилирую ProjectFile.csproj, я получаю DLL для каждого языка, но я включаю только скомпилированные библиотеки для каждого языка, а не ресурсы, и это не работает!
Наиболее очевидная причина заключается в том, что установщик пакета nuget забывает скопировать вспомогательные сборки и обеспечивает их копирование в каталог сборки проекта. Вы бы сказали, что это непросто.
Пакет nuget - это zip-файл, распакуйте его и посмотрите его содержимое, все ли сборки ресурсов присутствуют?





Вы подтверждаете, что пакет nuget создан правильно, т.е. файлы
.resxвключены? Также см. Создание локализованных пакетов NuGet