【C#】编译问题汇总
一、调试问题
1、System.Reflection.TargetInvocationException 调用的目标发生了异常
这个错误是在没有加上try catch捕捉异常前,跳转到了Main()函数里报错。
加上异常捕获后,报System.Threading.ThreadAbortException:正在中止线程:
解决方案:https://www.cnblogs.com/imstrive/p/5631147.html
2、未加载mscorlib.pdb/System.Reflection.TargetParameterCountException 未经处理的异常在mscorlib.dll中发生/参数计数不匹配
delegate声明处的参数数量一定要与调用时传入的参数数量一致!
这个问题编译阶段不会出现编译错误,但运行时就报错了,一定要注意。
http://blog.sina.com.cn/s/blog_6b6bf63d0102y2r8.html
3、无法修改“xxx”的返回值,因为它不是变量
(1)C#:struct的陷阱:无法修改“xxx”的返回值,因为它不是变量
https://blog.csdn.net/u012169685/article/details/48317577?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
(2)无法修改"List.this[int]"的返回值,因为它不是变量
https://blog.csdn.net/Anfeng0228/article/details/80083522
4、当前上下文中不存在名称InitializeComponent
打开当前控件.Designer.cs文件,第一行的namespace名字是否与控件窗口名字一致
5、LC.exe”已退出,代码为 -1
在VS解决方案资源管理器里,把项目文件夹下Properties文件夹下的licenses.licx文件删除,重新编译。
https://jingyan.baidu.com/article/b24f6c822592b686bfe5daac.html
6、CLR无法从COM上下文 0x622b440转换为COM上下文 0x622b5b0
https://blog.csdn.net/zy19901021xy/article/details/84855231
7、未能写入输出文件“...\obj\Debug\xxx.exe”--“另一个程序正在使用此文件,进程无法访问
(1)偶尔产生的,则手动删除项目里的obj文件夹,再重新生成即可。
(2)伴随警告 “xxx.cs”中的类型与“x.exe”中导入的类型“xxx”冲突,请使用“xxx.cs”中定义的类型。
且项目中每个类都如此提示,那么应该是因为在“引用”中引用了项目本身,从引用中册除对所在项目的引用就可以了,同时可以解决错误和警告。
(3)频繁产生,查看是否用到了this.Hide(),这个函数会导致窗口隐藏,但其实一直在后台运行,导致程序没有关干净。
8、MSBuildToolsPath is not specified for the ToolsVersion解决办法
解决办法:32位的机器:在注册表中找到以下注册项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild,删掉以下东西
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\14.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\TOolsVersions\14.0
如果是64位的机器,还需要找到以下注册项:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild
删掉以下东西
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\14.0 HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\MSBuild\ToolsVersions\14.0
重新启动IDE,就恢复正常了。
9、不安全代码只会在使用 /unsafe 编译的情况下出现
解决方案资源管理器,在项目上右键-->属性-->生成-->勾选 允许使用不安全的代码
10、属性不可作为 ref 或 out 参数传递
(1)为什么在C#中属性不可作为 ref 或 out 参数传递?
https://bbs.csdn.net/topics/350262475
(2)C#中使用ref 和 out 的一点认识
https://www.cnblogs.com/tangt/p/3914147.html
11、项目引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
(1)在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4。
而我原来的设置是.NET Framework 4 Client Profile。问题就出在这里。
以下是MSDN给出的提示:
If you are targeting the .NET Framework 4 Client Profile, you cannot reference an assembly that is not in the .NET Framework 4 Client Profile. Instead you must target the .NET Framework 4.
不过也因为如此,当在 Visual Studio 2010 建立新项目时,如果发现 [添加引用] 中没有列出原本应该列出的组件或者引用的其他程序集,在代码中的调用一直提示找不到名字空间时,可以先检查是否是项目的 target framework 设成了 .NET 4.0 Client Profile (例如 System.Web.dll 就不在 .NET 4.0 Client Profile 套件中),若是改成.NET Framework 4就OK了。
(2)检查Dll.net版本与当前项目是否一致,90%不一致。
https://www.cnblogs.com/xdot/p/6266735.html
12、未能加载文件或程序集“XXXX, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
13、代码调试正常,EXE不报错直接闪退
(1)问题描述
应用程序用VS2013直接启动运行时,一切正常;双击生成的EXE打开后直接就闪退了。调试发现屏蔽掉初始化时某段调用外部DLL的方法就能正常运行EXE了,但该DLL没有源码可调试。在代码里加了try catch{}也没有抓到任何异常。
(2)问题解决过程
1)Windows的事件查看器
通过Windows的事件查看器可以看到启动EXE后捕获到的错误
报clr.dll错误,百度了一圈还是不知道咋处理,不知道是不是跟内存泄漏有关...
2)Main()增加异常捕获代码
//设置应用程序处理异常方式:ThreadException处理
[HandleProcessCorruptedStateExceptions] static void Main() { try { //设置应用程序处理异常方式:ThreadException处理 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //处理UI线程异常 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //处理非UI线程异常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Process process = RuningInstance(); if (process == null) { Application.Run(new FrmMain()); } else { //MessageBox.Show("应用程序已经在运行中。。。"); HandleRunningInstance(process); } } catch(Exception ex) { SaveLog(ex.ToString()); Console.WriteLine("!!!" + ex.ToString()); MessageBox.Show("!!!" + ex.ToString()); //throw; } //Application.Run(new FrmMain()); } private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine("!!!" + e.ToString()); MessageBox.Show("!!!" + e.ToString()); } private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { Console.WriteLine("!!!" + e.ToString()); MessageBox.Show("!!!" + e.ToString()); }
然鹅还是没捕获到...
3)改变DLL入口点的调用约定
原来写的是:
[DllImport("CHR34XXX.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
改成:
[DllImport("CHR34XXX.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
问题解决...
参考:https://blog.csdn.net/DxgTeam/article/details/113656892
14、System.InvalidOperationException:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
添加
if (this.IsHandleCreated) { }
判断窗体或控件的句柄是否还存在,之后才使用控件
15、debug assertion failed
右击你需要运行的软件程序,选择“属性”。
在弹出的窗口中的选项卡里选择“兼容性”。
将兼容性下面的“以兼容模式运行这个程序”和“以管理员身份运行此程序”进行勾选。
完成后再次运行软件即可。
https://baijiahao.baidu.com/s?id=1713771530260894251&wfr=spider&for=pc
16、try-catch捕获不到异常,直接在Program.cs文件的Application.Run(new MainForm())行报系统错误
原因1:try中抛出的异常类型不属于catch的异常类或者它的子类;
原因2:try中的方法是异步方法以致于下面catch不到,这种情况可以将异常获取移动到异步方法内部进行处理。
一定要注意使用BeginInvoke时把try-catch写到内部。
17、正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
把VS菜单的 调试->异常->Managed Debuggin Assistants->LoaderLock 的选中状态去掉。
18、目标平台为x64,自定义控件不可用,显示控件未能加载
VS是x86的程序,要针对当前平台(x86)生成,才可以正常使用窗体设计器。
解决办法
1:平台目标设置为AnyCPU平台修改窗体,修改好了再替换到X64进行使用;
解决办法2:将自定义控件只封成一个控件库,然后在X64平台进行调用。