Не удается загрузить потоки DLL ресурсов с помощью BamlLocalizer в .NET Core 3.0 - PullRequest
0 голосов
/ 27 июня 2019

В решении Visual Studio 2019 я создал два WPF-проекта .NET Core 3.0.

К первому я добавил заголовок главного окна «Привет».Я также добавил строку <UICulture>en-US</UICulture> в файл .csproj и скомпилировал.Это привело к созданию файла en-US \ First.resources.dll.

Во второе я добавил кусок кода (который я запускаю при запуске), который я нашел в исходном коде locbaml на Github :

var streams = new List<Stream>();

var assembly = Assembly.LoadFrom(Environment.GetCommandLineArgs()[1]);

foreach (string resourceName in assembly.GetManifestResourceNames())
{
    var resourceLocation = assembly.GetManifestResourceInfo(resourceName).ResourceLocation;

    // if this resource is in another assemlby, we will skip it
    if ((resourceLocation & ResourceLocation.ContainedInAnotherAssembly) != 0)
    {
        continue;   // in resource assembly, we don't have resource that is contained in another assembly
    }

    Stream resourceStream = assembly.GetManifestResourceStream(resourceName);
    using (var reader = new ResourceReader(resourceStream))
    {
        foreach (DictionaryEntry entry in reader)
        {
            string name = entry.Key as string;
            if (BamlStream.IsResourceEntryBamlStream(name, entry.Value))
            {
                streams.Add((Stream)entry.Value);
            }
        }
    }
}

foreach(var stream in streams)
{
    var mgr = new BamlLocalizer(stream);

Если в параметрах отладки проекта для первого аргумента командной строки задано значение "First.resources.dll"

Я скопировал First.dll и First.resources.dll в папку bin \ Debug \ netcoreapp3.0 второго проекта, установите его активным, а затем нажмите кнопку отладки.После выполнения последней строки, которую он выдает:

System.IO.FileNotFoundException: 'Could not load file or assembly 'First, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.'

Я предположил, что First.resources.dll существует независимо от любых других сборок и что он содержит только ресурсы.Однако, похоже, что он ссылается на другие сборки, которые BamlLocalizer не может найти по какой-то причине.Зачем ему искать Первую сборку?

Я рискнул зайти так далеко только потому, что на горизонте не появился инструмент locBaml для ядра .NET.

Обновление: Я взял вышеуказанный блок кода и поместил его непосредственно в метод запуска в рамках Первого проекта.Затем эта последняя строка завершается успешно - так что, очевидно, существует проблема, решающая сборку.Тем не менее, только один поток найден, и когда я пытаюсь извлечь ресурсы из него:

var dict = mgr.ExtractResources();

foreach (var entry in dict)
{

Словарь пуст, несмотря на то, что я могу открыть ресурс DLL в двоичном режиме и увидеть локализуемый тексттам.

...