安装重建的 C# 项目后未处理的异常

Posted

技术标签:

【中文标题】安装重建的 C# 项目后未处理的异常【英文标题】:Unhandled exception after installing rebuilt C# project 【发布时间】:2021-12-06 07:25:36 【问题描述】:

我正在尝试构建/重建一个需要现代化的旧 C# 项目。它作为 Windows 服务运行。我做了一些更改来更新它,但是当我构建它时,它在启动时引发了异常。我撤消了所有更改,并确保 Git 没有检测到任何更改。它仍然在安装后立即抛出异常。我有一个 2016 年构建的旧安装文件,它仍然可以完美安装。 我显然也在 2017 年、2018 年和 2019 年构建了这个项目,我记得没有任何问题。我刚刚找到了一个我在 2017 年构建的旧安装程序,它在安装后也抛出了异常。

My_Service_Setup 项目上选择 Build 或 Rebuild 没有区别。

1>------ Rebuild All started: Project: My_Service, Configuration: Debug Any CPU ------
1>  My_Service -> C:\project\My_Service\bin\Debug\My_Service.exe
------ Starting pre-build validation for project 'My_Service_Setup' ------ 
------ Pre-build validation for project 'My_Service_Setup' completed ------
2>------ Rebuild All started: Project: My_Service_Setup, Configuration: Debug ------
Building file 'C:\project\My_Service_Setup\Debug\My_Service_Setup.msi'...
Packaging file 'AutomaticUpdater.dll'...
Packaging file 'client.wyc'...
Packaging file 'Newtonsoft.Json.dll'...
Packaging file 'My_Service.exe.config'...
Packaging file 'wyUpdate.exe'...
Packaging file 'My_Service.exe'...
========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========

IDE 是 Visual Studio 2015 Enterprise。我没有使用与上次相同的计算机,但之前的计算机和这台计算机一样运行的是 Windows 10。

我无法调试它,因为它从系统用户开始(应该如此),当我切换到管理员用户以调试它时,不再发生异常。有效的安装程序还会安装服务以在系统下运行,因此新的安装程序正在安装它以在正确的用户下运行。

我也无法从 Visual Studio 调试它,因为服务必须作为服务安装并且不能从调试器启动。

我的设置与导致此异常发生的原始开发人员的设置有何不同?我是否缺少一些 Visual Studio 没有告诉我的依赖项? .NET 版本中是否存在版本不兼容?我只是不知道是什么导致了这个未处理的异常。

【问题讨论】:

“我无法调试它,因为它从错误的用户开始,当我切换到正确的用户时,异常不再发生。” - 不是吗告诉你什么? @Fildor 是的,它告诉我管理员拥有全部权限,但系统没有。但这并不能帮助我解决问题。 @Fildor 我刚刚仔细检查过。无异常运行的和抛出异常的运行在同一个用户下。这是完全相同的代码,只是在不同的时间在不同的计算机上构建。所以,不,用户似乎是一个红鲱鱼。 好吧,这很奇怪。你能指出这两个版本之间的任何变化吗? @Fildor 导致它的行是System.Diagnostics.Debugger.Launch(); 我才刚刚开始阅读有关它的内容,而且似乎应该立即抛出一个未处理的异常以便调出 Visual Studio 界面。我对代码构建的“发布”版本也有问题,所以我一直在使用“调试”。这是由于原始开发人员设置的项目具有所需库的相对路径。我将其更改为绝对路径,构建了一个“发布”版本,瞧!启动时不再有未处理的异常! 【参考方案1】:

这是(编译器)错误/异常的喜剧/悲剧。 Visual Studio 2015 在打开时选择了“Debug”配置,将其更改为“Release”配置将无法成功构建项目。调试构建一开始就抛出未处理的异常显然是预期的行为。执行此操作的代码行位于编译器指令中:

        protected override void OnStart(string[] args)
        
#if DEBUG
            System.Diagnostics.Debugger.Launch();
#endif

注释掉那行在启动服务时停止了未处理的异常,但显然是解决问题的错误方法。然后我查看了“Release”中的错误是什么。它正在寻找具有相对路径而不是绝对路径的库文件。由于我将该项目安装在与原始开发人员不同的目录中,因此找不到该文件,但奇怪的是仅用于“发布”配置。 “调试”配置能够找到它并包含它。

因此,修复相对路径并将配置从“调试”更改为“发布”解决了问题!

【讨论】:

以上是关于安装重建的 C# 项目后未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章

如何确保 C# 项目中配置文件的更改导致 DLL 被重建?

执行后未处理的异常

在 Visual Studio 2015 中创建后未构建 Xamarin UWP 项目

C#异常处理,暂时停止循环

类中的异常处理和 C# 的代码隐藏

MSBuild 如何决定是不是需要重建 C# 库?