Не можете получить доступ к встроенному файлу конфигурации nlog? - PullRequest
0 голосов
/ 27 февраля 2012
system.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
            System.IO.Stream inputStream = assembly.GetManifestResourceStream(assembly.GetType().Namespace + "Manager.NLog.config");
            using (StreamReader reader = new StreamReader(inputStream))
            {
                string result = reader.ReadToEnd();

            }

получить нулевую ошибку в качестве входного потока?Я добавил файл конфигурации в папку проекта.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Если вы добавили файл Manager.NLog.config в корневую папку проекта и ваш проект называется Foo, то правильный ключ, под которым будет встроен файл: Foo.Manager.NLog.config.

В вашем примеревы, похоже, используете метод Assembly.GetExecutingAssembly, но вы убедились, что сборка, возвращаемая этим методом, на самом деле является сборкой, содержащей файл Manager.NLog.config?

Также обратите внимание, что assembly.GetType().Namespace всегда будет возвращать System.Reflectionпоэтому ваш код выглядит следующим образом:

var inputStream = assembly.GetManifestResourceStream("System.ReflectionManager.NLog.config");

и я очень сильно сомневаюсь, что этот ключ правильный.

Так что вы можете попробовать что-то вроде:

var assembly = Assembly.GetExecutingAssembly();
var key = assembly.GetName().Name + ".Manager.NLog.config";
using (var inputStream = assembly.GetManifestResourceStream(key))
using (var reader = new StreamReader(inputStream))
{
    var result = reader.ReadToEnd();
}
1 голос
/ 05 апреля 2012

Этот код будет работать независимо от того, куда вы поместите файл конфигурации в структуру вашего проекта. Убедитесь, что вы установили для параметра «Действие сборки» значение «Встроенный ресурс», поскольку я уверен, что вы это уже сделали.

using System;
using System.IO;
using System.Linq;
using System.Reflection;

var exe = Assembly.GetExecutingAssembly();
string resourceName = exe.GetManifestResourceNames()
                         .FirstOrDefault(s => s.IndexOf("NLog.config", StringComparison.OrdinalIgnoreCase) > -1);
if (!string.IsNullOrEmpty(resourceName))
{
  using (var xml = new StreamReader(exe.GetManifestResourceStream(resourceName)))
  {
    string xmlConfig = xml.ReadToEnd();
    if (!File.Exists("NLog.config"))
    {
      // Do something with the log file, like write it out to the root directory.
      File.WriteAllText("NLog.config", xmlConfig);
    }
  }
}
...