Есть ли способ прочитать текстовый файл из сборки с помощью отражения в C #? - PullRequest
1 голос
/ 26 октября 2009

У меня есть текстовый файл внутри сборки, скажем, MyAssembly. Я пытаюсь получить доступ к этому текстовому файлу из кода следующим образом:

Stream stream = Assembly.GetAssembly(typeof(MyClass)).GetFile("data");

где data - файл data.txt, содержащий некоторые данные, и я добавил этот .txt в качестве встроенных ресурсов. У меня есть купольное чтение изображений из Assebly как встроенных ресурсов с кодом, подобным этому:

protected Stream GetLogoImageStream()
       {

           Assembly current = Assembly.GetExecutingAssembly();
           string imageFileNameFormat = "{0}.{1}";
          string imageName = "myLogo.GIF";

           string assemblyName = current.ManifestModule.Name;
           int extensionIndex = assemblyName.LastIndexOf(".dll", StringComparison.CurrentCultureIgnoreCase);
           string file = string.Format(imageFileNameFormat, assemblyName.Remove(extensionIndex, 4), imageName);            
           Stream thisImageStream = current.GetManifestResourceStream(file);
           return thisImageStream;

       }

Однако этот подход не работал при чтении файла .txt из исполняемой сборки. Буду очень признателен, если кто-нибудь подскажет мне подход к чтению .txt файла из сборки. Пожалуйста, не спрашивайте меня, почему я не читаю файл с диска или общего сетевого ресурса. Просто скажите, что требуется прочитать файл .txt из сборки.

Большое спасибо

Ответы [ 3 ]

3 голосов
/ 26 октября 2009

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

  • Компилятор VB.NET генерирует имя ресурса <root namespace>.<physical filename>.
  • Компилятор C # создает имя ресурса <default namespace>.<folder location>.<physical filename>, где <folder location> - относительный путь к папке файла в проекте, используя точки в качестве разделителей пути.

Вы можете вызвать метод Assembly.GetManifestResourceNames в отладчике, чтобы проверить фактические имена, сгенерированные компилятором.

0 голосов
/ 26 октября 2009

Я очень благодарен за помощь всем в этом вопросе. Я смог прочитать файл с кодом следующим образом:

Assembly a = Assembly.GetExecutingAssembly();
            string[] nameList = a.GetManifestResourceNames();
            string manifestanme = string.Empty;
            if (nameList != null && nameList.Length > 0)
            {
                foreach (string name in nameList)
                {
                    if (name.IndexOf("c.txt") != -1)
                    {
                        manifestanme = name;
                        break;
                    }
                }
            }

            Stream stream = a.GetManifestResourceStream(manifestanme);

Спасибо и +1 за Кристиана Хейтера за этот метод: a.GetManifestResourceNames ();

0 голосов
/ 26 октября 2009

Ваш подход должен работать. GetManifestResourceStream возвращает ноль, если ресурс не найден. Попробуйте проверить значение времени выполнения вашей переменной file с фактическим именем ресурса, сохраненного в сборке (вы можете проверить его, используя Reflector ).

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