C# извлечь встроенный ресурс из сборки в указанное c расположение в p c? - PullRequest
0 голосов
/ 08 февраля 2020

Как я могу одним нажатием кнопки экспортировать файл (типы файлов: .jpg, .txt, .dll, ... et c) из кода ресурса моего приложения в указанное c местоположение на моем компьютере (для пример: C: \ drive) Я попробовал этот код нажатием кнопки: Основной код:

Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ApplicationName.Files.name.dll");
        FileStream fileStream = new FileStream("name.dll", FileMode.CreateNew);
        for (int i = 0; i < stream.Length; i++)
            fileStream.WriteByte((byte)stream.ReadByte());
        fileStream.Close();

Но приложение остановилось и показало мне эту ошибку: Сообщение об ошибке :

System.NullReferenceException: 'Object reference not set to an instance of an object.'

stream was null.

Дополнительная информация:

1) Я загружаю файл .dll в свои ресурсы.

2) Я изменил этот файл на Действие сборки на = "Встроенный ресурс".

Я попытался с помощью Клинта ниже. Изображения моего проекта сейчас:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

1 Ответ

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

Сценарий I (Ваш сценарий)

  • У вас есть проект со встроенным ресурсом, например (images, txt, et c)
  • Вы хотите извлечь этот файл из вашей сборки и перенести его в другое место

Сценарий II

  • У вас есть проект библиотеки классов (dll), который имеет встроенный ресурс, такой как (images, TXT, et c)
  • Вы загружаете эту DLL в ваш основной проект и хотите получить доступ к ресурсам (изображения) в вашей DLL

Использование

enter image description here

Внимание: перед использованием кода

  • packages.config является EmbeddedResource ( Замените его ресурсом, который вы используете )

  • Namespace моего проекта ConsoleApp ( Замените его своим пространством имен )



Main

   static void Main(string[] args)
   {

        ResourceManager.GetResourceInfo("packages.config");
        if (ResourceManager.resourceExists == false)
            return;

        //Loads packages.config in Bin/Debug
           ResourceManager.LoadResource("packages.config");

    }


ResourceManager.cs * 10 64 *

    class ResourceManager
    {
      public static bool resourceExists { get; set; } = false;
      private static Stream resourceStream { get; set; }
      public static void GetResourceInfo(string fileNameWithExtension)
      {

          //Substitut this with your Project Name
        //Class Library Name AssistantLib >  Resources > AssistantLib.dll 
        const string pathToResource = "ConsoleApp.Folder1.Folder2";
        //The Dll that you want to Load
        var assembly = Assembly.GetExecutingAssembly();
        //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);
        }
      }
    }

Выход

Package.Config в выходной папке

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...