Мне трудно заставить мою (настольную) программу распознавать ресурсы, по-видимому, при правильном создании менеджера ресурсов. Я прочитал вопрос 6567964 , который дал некоторое представление, но не решил эту проблему.
Я использую MonoDevelop 7.8.2, Mono 5.18.1.3, в Debian 9. .NET Core не установлен. Я не думаю, что это должно иметь значение?
Я создал несколько ресурсов текстовых файлов, some-filename.en-US.txt и some-filename.es-ES.txt, как описано на этой странице MSDN:
https://docs.microsoft.com/en-us/dotnet/framework/resources/creating-resource-files-for-desktop-apps#TextFiles
Основываясь на том, что я читал здесь и в других местах MSDN, я добавил их в свой проект и установил их свойства «Встроенный ресурс». Их ResourceID автоматически устанавливается на «some-filename.txt»
Я добавил "[assembly: NeutralResourcesLanguageAttribute (" en ")]" в AssemblyInfo.cs.
Когда я собираю проект, он генерирует «my-namespace.resource.DLL» в папках Satellite, которые в моем случае находятся в ../myapp/bin/Debug. Разрешения DLL позволяют читать и выполнять их любому. Я ожидал "app-name.resource.dll". Является ли "my-namespace" правильным?
Так как это в Linux, я не использовал компоновщик сборки, упомянутый MS, или какие-либо инструменты, кроме MonoDevelop. Мне не нужно ничего устанавливать в Global Assembly Cache, поэтому, по-видимому, мне не нужно заботиться о подписании. Это правильно?
В моей программе код скопирован на 99% из примеров в MSDN:
CultureInfo newCulture = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = newCulture;
ResourceManager rm = new ResourceManager("resource-id but without the extension", typeof("main-assembly-class-name").Assembly);
string str = String.Format("The current culture is {0}.\n{1}",
Thread.CurrentThread.CurrentCulture.Name,
rm.GetString("one-of-the-names-in-the-original-text-file"));
Console.Write(str);
Когда я запускаю программу и пытаюсь получить доступ к этим ресурсам, она выдает:
"Не удалось найти ресурсы, подходящие для указанной культуры или нейтральной культуры. Убедитесь, что blahblah.resources \" правильно встроен или связан с сборкой \ "namespace-of-main-class \" во время компиляции, или что все необходимые спутниковые сборки являются загружаемыми и полностью подписаны. "
Я также попытался создать ResourceManager, используя только базовое имя и внутренний класс с тем же именем, что и ресурс, как описано здесь:
https://docs.microsoft.com/en-us/dotnet/api/system.resources.resourcemanager?view=netframework-4.8
Я попытался создать ResourceManager, используя только NameSpace, как описано здесь:
https://docs.microsoft.com/en-us/dotnet/api/system.resources.resourcemanager?view=netframework-4.8#instantiating
Я использовал пример программы, приведенной на этой странице, в качестве независимой программы, еще более упрощенной благодаря использованию только файлов en-US и es-ES и выбору es-ES явно, а не случайно.
Все эти варианты вызывают одно и то же исключение. Обратите внимание, что это не исключение "Культура не найдена".
Отладчик показывает, что создается ResourceManager и что устанавливается Thread.CurrentThread.CurrentCulture. Похоже, проблема заключается в создании ResourceManager, который может правильно ссылаться на ресурсы.
Чего мне не хватает?