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,等待命令返回即可。

posted @ 2020-08-13 13:14  publiter  阅读(2056)  评论(0编辑  收藏  举报