2009-10-26 1 views
1

У меня есть текстовый файл внутри сборки, говорят MyAssembly. Я пытаюсь получить доступ к этому текстовый файл из кода, как это:Есть ли способ прочитать текстовый файл из сборки, используя Reflection в C#?

Stream stream = Assembly.GetAssembly(typeof(MyClass)).GetFile("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-файл из сборки.

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

+0

Это должно работать точно так же для текстовых файлов, как и для изображений - что вы имеете в виду, что этот подход не работает? Вы получаете исключение? –

+0

Ну, я не получил никакого исключения, но метод вернул NULL. – Shiva

ответ

0

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

3

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

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

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

0

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

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 для Christian Хейтер для этого метода: a.GetManifestResourceNames();