zoukankan      html  css  js  c++  java
  • C#开发常见问题处理

    在.Net开发过程中,常遇到一些感觉莫名其妙或者感觉棘手的bug,此处记录下来方便后期遇到同样的问题手忙脚乱。


    1、托管调试助手 “ContextSwitchDeadlock”:“CLR 无法从 COM 上下文 0xcc09e0 转换为 COM 上下文 0xcc0790,这种状态已持续 60 秒。

    分析:

    拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作。
    这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。
    要避免此问题,所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。”

    原因:sql语句太过复杂或者查询的数据量太过庞大,程序未能及时响应。

    解决方法:

    在Debug -> Exceptions -> Managed Debug Assistants里 去掉ContextSwitchDeadlock一项前面的钩。

    在调试(菜单)–>异常–> Managed Debug Assistants里 去掉ContextSwitchDeadlock一项前面的钩。



    2、LoaderLock异常:正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。

    分析:https://blog.csdn.net/cjf_iceking/article/details/40043569

    解决方法:

    在"Debug"菜单下----"Exceptions"----"Managed Debugging Assistants"中掉"LoaderLock"



    3、dll已引用,也写了using,命名空间也没错,编译也没错,但打开文件提示“未能找到类型名称或命名空间名称XXX(是否缺少using指令或程序集引用)”

    分析:修改了编译环境后可能导致。

    解决方法:关闭解决方案,删除缓存文件,如.sdf,TraceDebugging*.iTrace文件,这样打开解决方案的时候就会重新解析文件,就会自动获取dll的命名空间,自然不会再报错。



    4、无法嵌入互操作类型

    分析:引用了类dll文件默认引用属性:嵌入互操作类型是True。

    解决方法:修改类对应dll文件的属性:嵌入互操作类型=False。

    5、设置以管理员身份运行方法

    解决方法:

    通过添加应用程序清单文件:在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮

    添加后,默认打开app.manifest文件,将:

    <requestedExecutionLevel level="asInvoker" uiAccess="false" />   修改为: <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

    然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。

    重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。

    需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。

    选择 使用其他凭据重新启动 即可。

    6、打开设计视图时报"未将对象引用设置到对象的实例"

    分析:通常情况下,若是你将用户控件写好了放入窗体中,若是有不合理的代码,则会弹出错误提示框,不让你放。若是你之前只是随便加了一个用户控件,并且没有什么问题,但后来你又把控件改坏掉了,那么你打开就会报错(在窗体内显示错误,选择"忽略并继续"还是可以打开设计界面的)。

    一般在设计时打开设计视图报"未将对象引用设置到对象的实例",基本上都是你在用户控件的构造方法及Form Load事件中写入了计算的代码。

    解决方法:

    UserControl构造函数和load函数尽量简单,不要放计算代码,一定要放则在InitializeComponent();函数后面放以下代码
    //在设计模式下直接返回,不再执行下面的代码,只有在程序运行时才执行后面的代码
    if (DesignMode) return;
    //如果还是有问题,则添加下面代码(谨慎添加),当运行的进程是VS Studio时,不执行后面的代码
    if (string.Compare(System.Diagnostics.Process.GetCurrentProcess().ProcessName, "devenv") == 0) return;

    7、WPF 正常的项目突然提示 当前上下文中不存在名称“InitializeComponent”

    分析:虽然有红线提示错误,但是项目任然可以运行起来。造成此错误一般是复制项目但未拷贝项目生成的obj文件夹导致,造成找不到类似objx86DebugMainShellMainWindowShell.g.i.cs文件导致。

    解决方法:定位错误文件xaml.cs,得到对应xaml文件,随便修改下该文件,然后保存,重新编译即可。

  • 相关阅读:
    Servlet 易错点和注意点
    Spring 完成自动注入(autowire)
    Java 定时调度Timer&Quartz
    常用Linux命令杂记
    Spring 使用AOP——基于注解配置
    Spring 使用AOP——xml配置
    Spring 使用纯注解方式完成IoC
    Spring 简单使用IoC与DI——XML配置
    让多个HTML页面 使用 同一段HTML代码
    Feture、ListenableFuture、ComplatableFuture
  • 原文地址:https://www.cnblogs.com/publiter/p/13495809.html
Copyright © 2011-2022 走看看