小编Loa*_*ian的帖子

反序列化XML时的FileNotFoundException

我们最近开始看到FileNotFoundException在反序列化XML时偶尔被抛出.消息是无法找到用于从XML映射到代码的临时程序集.从这个文档看起来,当.NET Framework无法创建此文件时会发生这种情况(但是即使在内部异常中也没有捕获到这个原因).

这是一个例外:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Could not find file 'C:\Documents and Settings\user\Local Settings\Temp\c5_nfoko.dll'.
Run Code Online (Sandbox Code Playgroud)

每个错误的文件名都不同,但错误始终相同,它来自此处(底部的完整调用堆栈):

at System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
at System.Xml.Serialization.XmlSerializer..ctor(Type type)
Run Code Online (Sandbox Code Playgroud)

CSharpCodeGenerator试图生成程序集时.我们多年来一直在生产中使用这些代码,而且非常稳定.它刚开始在上周左右失败了.我们想知道它是否与最新的Microsoft安全补丁有关,因为它会影响我们在多个操作系统(XP和Server 2003)上的.NET 2.0和.NET 4.0代码版本.

错误是零星的,再次运行该过程通常会导致它消失.这是一个单线程命令行应用程序,它检索文件并将它们插入到数据库中.

我找不到其他人有同样的问题,但它并没有被隔离到相同的代码行,我们有几个地方使用System.Xml.Serialization代码,我们已经看到了每个错误.这段代码也不是我们最近改变的.

我能找到的最接近的其他帖子就是这个.

在我们的QA VM上没有病毒扫描程序,因此我不认为这是一个问题.我们在托管环境和单独的客户端站点中也看到了这个问题.

我们尝试过:

  1. 清理此临时目录
  2. 检查临时目录的权限(用户是框中的本地管理员)
  3. 通过使用sgen.exe生成XmlSerializers.dll并将它们部署到app文件夹(问题仍然存在,就像.NET Framework不想使用这些程序集一样).

如果有人有任何想法或建议会有所帮助.

完整的callstack:

Type : System.IO.FileNotFoundException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Could not find file 'C:\Documents and Settings\user\Local …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization filenotfoundexception

11
推荐指数
1
解决办法
5727
查看次数

使用具有IEnumerable的Lambda表达式树

我一直在努力学习更多关于使用Lamba表达式树的知识,因此我创建了一个简单的例子.这是代码,如果作为C#程序粘贴,这可以在LINQPad中使用.

void Main()
{
    IEnumerable<User> list = GetUsers().Where(NameContains("a"));
    list.Dump("Users");
}

// Methods
public IEnumerable<User> GetUsers()
{
    yield return new User{Name = "andrew"};
    yield return new User{Name = "rob"};
    yield return new User{Name = "chris"};
    yield return new User{Name = "ryan"};
}

public Expression<Func<User, bool>> NameContains(string namePart)
{
    return u => u.Name.Contains(namePart);
}

// Classes
public class User
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

无法从用法中推断出方法'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'的类型参数.尝试显式指定类型参数.

但是如果我用main替​​换main中的第一行:

IEnumerable<User> list = GetUsers().Where(u => u.Name.Contains("a"));
Run Code Online (Sandbox Code Playgroud)

它工作正常.可以告诉我,我做错了吗?

c# linq tree ienumerable expression

9
推荐指数
1
解决办法
1万
查看次数

Winforms应用程序中的未处理异常

我有一个简单的WinForms应用程序,用于输入测试用例.自从我将此应用程序升级到.NET 4.0并向标签页控件添加了一个新的标签页以便针对XSD架构验证XML之后,应用程序一直在随机崩溃.我一直无法重现异常.

我的QA人收到的错误是通用的Windows消息:

TestCaseViewer遇到问题,需要关闭.我们对造成的不便很抱歉.

为了尝试找到真正的错误,我将以下代码添加到Main方法的开头:

        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += Application_ThreadException;
Run Code Online (Sandbox Code Playgroud)

事件处理程序如下所示:

    static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
    {
        try
        {
            MessageBox.Show(e.Exception.ToString(), @"Thread Exception", 
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        finally 
        {
            Application.Exit();    
        }
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        try
        {
            var ex = (Exception)e.ExceptionObject;
            MessageBox.Show(ex.ToString(), @"Unhandled Exception",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        finally 
        {
            Application.Exit();    
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有任何帮助,无论如何,错误继续以一种产生未处理的错误的方式继续这样做,这种错误正在冒泡到操作系统.

任何人都可以给我任何关于捕获此异常的其他想法吗?

unhandled exception winforms

6
推荐指数
2
解决办法
6540
查看次数

.NET中的事件和内存泄漏

我正在使用C#.NET 3.5 ...我一直在努力通过将数据库相关活动移动到单独的工作对象来解耦BLL对象.worker对象将实体添加到数据库,并将事件成功或失败消息添加回BLL对象.

当我在BLL中实例化worker对象时,我连接了worker的事件并使用事件+ = delegate(eventhandler)语法设置BLL的事件处理程序.

我听说如果我没有使用 - =语法显式地取消监听器,那么当工作者被处置时可能存在内存泄漏.

所有这些处理都发生在一个Windows服务中,该服务从队列中获取消息并调用相应的BLL对象......我担心我可能会在此过程中引入内存泄漏.

.net events memory-leaks

4
推荐指数
1
解决办法
1237
查看次数