提问人:Broda 提问时间:6/22/2023 最后编辑:Broda 更新时间:6/22/2023 访问量:55
在不调试的情况下运行时使用 Forms 获取 NullReferenceException |调试时无异常
Getting NullReferenceException with Forms while running without debugging | No Exception if Debugging
问:
我想更新一些编程技能,并使用 VS .NET 7.0 启动了一个 c# 项目。 即使我只想编译这行代码
Form form = new Form();
我明白了
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Forms.NativeWindow.AdjustWndProcFlagsFromConfig(Int32 wndProcFlags)
at System.Windows.Forms.NativeWindow.get_WndProcFlags()
at System.Windows.Forms.NativeWindow.get_WndProcShouldBeDebuggable()
at System.Windows.Forms.NativeWindow.AssignHandle(IntPtr handle, Boolean assignUniqueID)
at System.Windows.Forms.NativeWindow.AssignHandle(IntPtr handle)
at System.Windows.Forms.NativeWindow.WindowClass.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
但是当我使用调试运行时,它会做它应该做的事情。
了解以下信息可能很重要: 首先,我必须引用System.Windows.Forms.dll,并使用NuGet安装System.Configuration.ConfigurationManger。
我做错了什么?
提前致谢, 布罗达。
答:
0赞
PMF
6/22/2023
#1
不要在 .NET 6.0+ 项目中添加对 的引用。这就是 .NET Framework 引用 Winforms 的方式,您现在甚至可能引用了 .NET Framework 库(您到底引用了什么?System.Windows.Forms.dll
相反,在 csproj 顶部附近的某个位置添加此行(在一个部分中):PropertyGroup
<UseWindowsForms>True</UseWindowsForms>
评论
0赞
Broda
6/22/2023
我只是添加一个引用路径:右键单击您的项目 -> 添加 -> 项目引用 -> 项目 -> 浏览并添加 \Microsoft.NET\Framework64\v4.0.30319\System.Windows.Forms.dll 我尝试了您的解决方案并删除了引用,我收到错误:找不到我在添加引用之前获得的类型或命名空间名称。
0赞
PMF
6/22/2023
@Broda是的,这就是我的假设。该文件来自 .NET Framework,从技术上讲,它与基于 .NET Core 的 5.0 及更高版本有很大不同。因此,删除该引用并添加如上所示的行。当然,您也可以创建一个新的 .NET Winforms 项目。确保模板说明中没有显示“.NET Framework”。
0赞
Broda
6/22/2023
据我了解,我所做的引用是对旧版本的引用?
0赞
Broda
6/22/2023
正如您所说,我添加了<UseWindowsForms>True</UseWindowsForms>,但这并没有解决问题。但是我也将<TargetFramework>net7.0</TargetFramework>更改为 <TargetFramework>net7.0-windows</TargetFramework>现在它正在唤醒。但我不知道为什么。
0赞
PMF
6/22/2023
这是因为 WinForms 仅在 Windows 上受支持,因此您需要告诉编译器您可以使用仅在 Windows 上支持的库/方法。
评论