【问题标题】:C# result is fine when I am debugging, but I get errors when I start the .exe file调试时 C# 结果很好,但启动 .exe 文件时出现错误
【发布时间】:2011-11-30 08:43:55
【问题描述】:

我在 C#、.Net 2.0 中工作。

当我调试我的代码时,一切正常。但是,当我创建 exe 时,它​​不是。我添加了一个记录器。这是我的一段代码:

string[] dllFiles = System.IO.Directory.GetFiles(getAddinDllPath(), "Begin_*.dll");
foreach (string dllFile in dllFiles)
{
    Logger.Info("ThisMethod numberX");
    if (!dllFile.EndsWith("someString.dll", StringComparison.InvariantCultureIgnoreCase))
    {
        Assembly assembly = Assembly.LoadFile(dllFile);

        foreach (Type type in assembly.GetTypes())
        {
            Logger.Info("ThisMethod  numberY");
         ...............

getAddinDllPath() 方法返回:

addinDllPath = Path.Combine(Path.Combine(myDocuments, "Visual Studio 2005"), "Addins") + "\\";

当我调试我的程序时,文本“ThisMethod number Y”在日志文件中多次出现。

当我创建 exe 并运行它时,记录器看起来像这样:最后是 ThisMethod numberX。它永远不会涉及“ThisMethod numberY”。

这是为什么呢?

这是我的记录器:

类记录器 { 私有静态字符串路径 = @"C:\Users\John\Documents\Projects\MyLogger.txt";

    public static string Path
    {
        get { return path; }
        set { path = value; }
    }

    public static void Info(string msg)
    {
        StreamWriter sw = File.AppendText(path);
        try
        {
            string logLine = System.String.Format(
                "{0:G}: {1}: {2}", System.DateTime.Now, @"INFO", msg);
            sw.WriteLine(logLine);
        }
        finally
        {
            sw.Close();
        }
    }
}

编辑: 如果 dllFiles 为空,则一切正常。但是如果文件在那里,那么问题就出现了。

编辑 2: 问题出在

Type type in assembly.GetTypes()

有人有想法吗?

【问题讨论】:

  • 将调试信息添加到您的发布版本并尝试调试这个。
  • 看起来你的 Logger 类没有刷新输出。
  • 请使用try catch,以便捕获运行时异常。
  • @UweKeim 版本相同,代码相同。
  • @leppie 我的记录器类在我调试代码时工作正常,它在记录器中写入了几次“numberY”。当我使用 exe 时,它​​没有。

标签: c# debugging logging


【解决方案1】:

如果"somePath" 与运行目录相关,那么您的 exe 可能正在扫描另一个目录 => 找不到 .dll 文件 => 未调用“ThisMethod numberY”。

如果我的猜测是真的 - 尝试在 somePath 中指定绝对路径。

【讨论】:

  • 我更新了我的问题。你现在可以看到 somePath 的值是什么了。
  • 那么也许您可以在 dllFiles 上的 foreach-loop 之前将Logger.Info(getAddinDllPath()); 之类的内容添加到您的代码中,并比较调试和发布的结果?如果它们相等,那么很可能@leppie 是正确的,您应该在日志记录类中的sw.WriteLine(logLine); 之后添加sw.Flush();
  • 但问题不在于记录器。我添加了记录器只是为了看看问题出在哪里。我的 exe 在记录器之前无法运行。
  • 我在getAddinDllPath中添加了Logger.Info,路径正确:C:\Users\John\Documents\Visual Studio 2005\Addins\
  • 您的代码看起来不错。也许有一些 NTFS 安全问题,例如以管理员/非管理员权限运行的调试和发布可执行文件?
【解决方案2】:

确保string dllFile in dllFiles 提供正确的 dll 地址并以您在代码中提到的字符串结尾,并确保日志文件在最后关闭。你一定会看到的。

【讨论】:

  • 我做了,结果是一样的。
【解决方案3】:

尝试使用IndexOf >=0 而不是EndsWith("someString.dll" 有时它会窃听 2. 可能是在其他程序集中定义或移动的类型之一/查看描述异常的 msdn GetTypes

【讨论】:

    【解决方案4】:

    我应该用过

    Assembly assembly = Assembly.LoadFrom(dllFile);
    

    而不是

    Assembly assembly = Assembly.LoadFile(dllFile);
    

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多