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文件夹导致,造成找不到类似\obj\x86\Debug\MainShell\MainWindowShell.g.i.cs文件导致。
解决方法:定位错误文件xaml.cs,得到对应xaml文件,随便修改下该文件,然后保存,重新编译即可。
8、关于c# 在vs2013 x86平台上开辟大内存
方法一:cmd定位到工具editbin,输入editbin /largeaddressaware $(TargetPath)。
方法二:打开项目属性|生成事件,在后期生成事件命令行中输入:editbin /largeaddressaware $(TargetPath) (以上路径必须是全路径)。
检查方法:cmd定位到工具dumpbin,输入dumpbin /headers executable_file。
9、项目添加引用提示“值不在预期范围内”
分析:可能是清理C盘时,删除了某些VSPackage文件导致。需要重建这些文件。
解决方法:管理员身份打开cmd,定位到VS安装目录“.\Common7\IDE”,输入devenv /setup,等待命令返回即可。