Winforms应用程序在bin/debug或bin/release中运行良好,但在外部则不然

zqry0prt  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(204)

我开发了一个Winforms C#应用程序(.NET Framework 4.8),它过去运行良好。最后一次更改时,我决定使用Gmap.NET添加一个Map控件。起初,在调试时一切看起来都很好,所以尝试了一下,并构建了一个发布版本(重要提示:我的解决方案有2个项目-第一个包含Winform应用程序,第二个是使用Microsoft Visual Studio安装程序项目2022扩展创建的安装项目)。
从这一点出发:
1.发布版本已成功。已安装新版本--〉启动时崩溃(闪屏短暂显示,然后消失。主窗体未加载)
1.我做了一些研究,看起来GMap.net有一些问题,我不得不手动编辑.csproj文件以正确获取所有依赖项(解释了in this question)3.显然其他一些引用是错误的,因为它仍然不工作。
当前状态:

  • 未引发异常。程序在调试模式下运行良好
  • 如果我单击Winform项目bin/debug或bin/release中的.exe,程序运行正常
  • 如果我将整个bin/debug或bin/release复制到其他位置并从那里启动,则程序在启动时挂起
  • 如果我安装程序并正常启动,则程序在启动时崩溃

我很困惑。我试过程序集日志绑定查看器,但只有一些关于XML. Serializer的消息,根据this question,可以忽略它们。我试过不使用“仅我的代码”选项进行调试,但没有看到任何内容。我还用写入日志文件的内容填充了我的代码,我可以看到:

  • 当从其他位置的bin(debug或release)文件夹的副本启动时,程序会像完全初始化一样写入日志,但主窗体会挂起并且不显示控件
  • 从bin(调试或发布)文件夹启动时,将按预期运行
  • 当从安装路径启动时,它会立即崩溃,日志会显示调用InitializeComponent()的跟踪:
public Form1()
        {
            using (StreamWriter sw = File.AppendText(Application.UserAppDataPath + @"\mainlog.txt"))
            {
                sw.WriteLine("Initializing Form 1 components");
            }

            InitializeComponent();

            using (StreamWriter sw = File.AppendText(Application.UserAppDataPath + @"\mainlog.txt"))
            {
                sw.WriteLine("Form 1 components initialized");
            }

确切地说,日志文件中的最后一条消息是“正在初始化Form 1组件”,但是,如果我尝试在InitializeComponent()中一步一步地调试,我没有看到异常,并且它工作正常(在Visual Studio的调试模式下总是如此)
我怀疑我的一些代码引用了一个DLL,当它在bin文件夹之外运行时,它找不到它。尽管它应该包含在安装程序中,但我找不到任何异常(尝试放置一些try-catch块,但没有效果)或者给我提示的消息。所以我愿意测试任何选项......只是善良和建设性的,因为我是一个硬件家伙出了他的舒适区,我的一些代码可能是一团糟。我可以粘贴特定的代码块每个请求,但整个应用程序现在坐在大约30 K行,所以我们最好是具体的(这也是为什么我不扔进垃圾桶,重新开始)。

EDIT 1:@Deolus注解后,我再次查看事件查看器,看到以下内容:

x一个一个一个一个x一个一个二个x

uqzxnwby

uqzxnwby1#

好吧,终于成功了。
这一切都归结为没有正确版本的SQLite.Interop.dll。因为我的“\packages\System.Data.SQLite.Core.1.0.117.0”和“\packages\System.Data.SQLite.1.0.117.0”文件夹只显示了一个.p7s和.nupkg文件,现在根本没有dll,所以我下载了dll,看起来他们错了。在我的ackages文件夹中搜索SQLite.Interop.dll,在“\packages\Stub.System.Data.SQLite.Core.NetFramework.1.0.117.0\build\net46\x64”和“\数据包\存根\系统\数据\SQLite.Core.NetFramework.1.0.117.0\内部版本\net46\x86”。
添加这些文件,正如here所解释的那样,就成功了:)

相关问题