【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平台进行调用。

 

posted @ 2022-03-30 09:55  不溯流光  阅读(1015)  评论(0编辑  收藏  举报