Найти ресурсы библиотеки классов из основного проекта - PullRequest
1 голос
/ 06 февраля 2020

Проблема

Мое решение состоит из нескольких проектов. Основным для пользовательского интерфейса мы будем называть Assistant, а бэкэнд мы будем называть AssistantLib.

Вот структура:

enter image description here

В AssistantLib я включил PDF-файлы в качестве ресурсов в папку ресурсов с Build Action из Содержимое и Copy to Output Directory как Копировать всегда . Я могу найти их при отладке, используя комбинацию из них:

    private string GetArtifactPath(string artifactName)
    {
        return Path.Combine(GetResourcePath(), artifactName);
    }

    public static string GetResourcePath()
    {
        return Path.Combine(Directory.GetCurrentDirectory(), "Resources");
    }

Это работает. Когда я возвращаю строку из GetArtifactPath, я открываю файл с Process объектом и AcroRd32.exe.

Обратите внимание, что мне нужно ссылаться на эти файлы по их путям к файлам. Они не простые тексты для чтения или потоковой передачи. Мне также нужно иметь возможность открывать их с определенным флагом, указанным AcroRd32.exe. Это означает, что У меня должен быть путь к файлу .

Проблема, с которой я сталкиваюсь, когда я публикую sh приложение ClickOnce, я получаю сообщение об ошибке, что файл не может быть найдено:

Error: Could not find a part of the path 'C:\Users\EL-C\AppData\Local\Apps\2.0\3JCPDD49.7G5\9122AMZE.NZL\azte..tion_edea8654ffceff97_0001.0000_447ed0da08290357\Resources\Guidelines\3.2'.. Stacktrace:    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

И, конечно, когда я go в это место, ресурсов там нет.

То, что я пробовал

  • Я изменил Build Action на Встроенный ресурс и ничего - тот же результат
  • Я изменил Copy Output Directory на Не копировать
  • Это не применяется, потому что я не могу транслировать эти ресурсы, они не простые текстовые файлы. Я также не пытаюсь их прочитать, я пытаюсь открыть их.
  • Это также не применяется, потому что ссылка MyNamespace.Properties.Resources.My_Zip_File; не работает в моей ситуации. Я не знаю название ресурса раньше времени.

Обновление

Я изучаю события после сборки. При этом я обнаружил, что эти ресурсы уже в выходном каталоге после сборки:

enter image description here

Но по какой-то причине они не отображаются, когда я публикую sh:

enter image description here

Обновление 2

Для иллюстрации как структура папок влияет на это, здесь до и после.

Когда ресурс находится в AssistantLib (например, EVMSBP), это структура:

Resource in Lib

А вот как выглядит папка ClickOnce publi sh после установки с ресурсом в AssistantLib:

Missing

В качестве альтернативы, когда ресурс находится в Assistant (снова EVMSBP), это структура:

Resource in Assistant

И вот что публикует ClickOnce * Папка 1123 * выглядит после установки с ресурсом в Assistant:

Not Missing

Насколько я могу судить, Ресурс ДОЛЖЕН быть частью Проект запуска. Это звучит как безумие?

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

С более подробной информацией о редактировании, я скопировал его

  • In AssistLib project


  • In AzTech Основной проект
    • Я ссылался на AssistLib.dll
    • Проверьте, существует ли ресурс (pdf), который я хочу загрузить, в AssistLib.dll
    • Загружает ресурс
    • Запускает PDF
    • Пока все хорошо
    • Я опубликовал приложение и установил
    • Я запустил приложение из Иконки на меню «Пуск»
    • , которое запускает PDF, встроенный в качестве ресурса в DLL


AzTech. CS

var nameOfTheFile = "test.pdf";
ResourceManager.GetResourceInfo(nameOfTheFile);
if (ResourceManager.resourceExists == false)
{ Console.WriteLine("Specified PDF file not found"); return; }

Console.WriteLine("Resouce found in DLL");
ResourceManager.LoadResource(nameOfTheFile);//Will load the pdf in your main project

Process.Start(nameOfTheFile);

 class ResourceManager
 {
        public static bool resourceExists { get; set; } = false;
        private static Stream resourceStream { get; set; }
        public static void GetResourceInfo(string fileNameWithExtension)
        {
            const string pathToResource = "AssistantLib.Resources.Guidelines";

            var assembly = Assembly.Load("AssistantLib");
            //var names = assembly.GetManifestResourceNames();
            var stream = assembly.GetManifestResourceStream($"{pathToResource}.{fileNameWithExtension}");
            if (stream == null)
                return;

            resourceExists = true;

            resourceStream = stream;

        }

        public static void LoadResource(string newFileNameWithExtension)
        {
            if(File.Exists(newFileNameWithExtension))
            {
                Console.WriteLine("File already exists");
                return;
            }
            using (Stream s = File.Create(newFileNameWithExtension))
            {
                Console.WriteLine("Loading file");
                resourceStream.CopyTo(s);
            }
        }
 }

0 голосов
/ 06 февраля 2020

Я столкнулся с той же проблемой, когда строил проект в формате exe с использованием настройки Visual Studio. Я просто добавил файл pdf в выходной каталог сборки проекта. Вы должны скопировать папку pdf в папку bin или release и использовать каталог ~ root для получения файла

...