无法访问嵌入式nlog配置文件?

时间:2012-02-27 14:04:47

标签: c# reflection nlog system.reflection

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();

            }

将null错误作为输入流?我在项目文件夹下添加了配置文件。

2 个答案:

答案 0 :(得分:4)

如果您将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 :(得分:1)

无论您将配置文件放在项目结构中的哪个位置,此代码都将起作用。确保将Build Action设置为" Embedded Resource"因为我相信你已经完成了。

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);
    }
  }
}