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

            }

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

4

2 回答 2

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();
}
于 2012-02-27T14:07:14.470 回答
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);
    }
  }
}
于 2012-04-05T03:14:16.803 回答