gpt4 book ai didi

c# - 为什么在控制台应用程序中使用 CommonOpenFileDialog 时会出现此异常?

转载 作者:行者123 更新时间:2023-11-30 12:54:25 30 4
gpt4 key购买 nike

问题

我正在尝试使用 CommonOpenFileDialog 的文件夹选择器,如 this answer 中所述.问题是,即使是一个非常精简的示例项目,我在尝试使用 CommonOpenFileDialog 的 ShowDialog() 函数时也会遇到异常。

代码

using Microsoft.WindowsAPICodePack.Dialogs;

namespace DialogTest
{
class Program
{
public static void Main(string[] args)
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;

CommonFileDialogResult result = dialog.ShowDialog();

if (result == CommonFileDialogResult.Ok)
{
//Do Stuff
}
}
}
}

我还与作者 Microsoft 一起使用了以下 nuget 包:

  • Microsoft.WindowsAPICodePack-Core
  • Microsoft.WindowsAPICodePack-Shell

异常

此代码在 dialog.ShowDialog(); 处产生以下异常:

System.Runtime.InteropServices.COMException was unhandled
ErrorCode=-2147023116
HResult=-2147023116
Message=A null reference pointer was passed to the stub. (Exception from HRESULT: 0x800706F4)
Source=Microsoft.WindowsAPICodePack.Shell
StackTrace:
at Microsoft.WindowsAPICodePack.Dialogs.IFileDialog.SetFileName(String pszName)
at Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialog.ApplyNativeSettings(IFileDialog dialog) in c:\projects\Windows API Code Pack 1.1\source\WindowsAPICodePack-NuGet\Shell\CommonFileDialogs\CommonFileDialog.cs:line 768
at Microsoft.WindowsAPICodePack.Dialogs.CommonFileDialog.ShowDialog() in c:\projects\Windows API Code Pack 1.1\source\WindowsAPICodePack-NuGet\Shell\CommonFileDialogs\CommonFileDialog.cs:line 609
at DialogTest.Program.Main(String[] args) in c:\users\obscerno\documents\visual studio 2015\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs:line 13
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

其他一些相关细节

  1. 我使用的是 Visual Studio 2015。
  2. 此错误的一个奇怪之处在于此代码在一年前就可以运行。我刚刚重新打开计划进行一些小改动的项目,但它不再运行了。
  3. 在创建新测试项目时,在第一次运行时,Visual Studio 提示我找到名为 CommonFileDialog.cs 的文件。

    它检查文件的初始目录是“c:\projects\Windows API Code Pack 1.1\source\WindowsAPICodePack-NuGet\Shell\CommonFileDialogs\CommonFileDialog.cs”,它在我的电脑上不存在。

    如果我选择“取消”,则在以后的调试过程中不会返回提示。我怀疑这个丢失的文件是问题的根源,但不知道如何处理这些信息。

我尝试过的

  1. 除了 this amusing but irrelevant question 之外,搜索异常并没有发现任何东西。 .

  2. 从多个来源安装相同的 nuget 包并没有给我任何不同的结果。因为for a while Microsoft made them unavailable,所以有很多包的副本.

  3. 我尝试在我的计算机中搜索文件“CommonFileDialog.cs”,但找不到。

最佳答案

作为trykyn mentioned in the comments ,解决这个问题的方法是在Main前面加上[STAThread]

工作代码如下所示。请注意,它需要调用 System

using System;
using Microsoft.WindowsAPICodePack.Dialogs;

namespace DialogTest
{
class Program
{
[STAThread]
public static void Main(string[] args)
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.InitialDirectory = "C:\\Users";
dialog.IsFolderPicker = true;

CommonFileDialogResult result = dialog.ShowDialog();

if (result == CommonFileDialogResult.Ok)
{
//Do Stuff
}
}
}
}

有关 STAThread 是什么的更多信息,此答案详细介绍了它:What does [STAThread] do?

The STAThreadAttribute is essentially a requirement for the Windows message pump to communicate with COM components. Although core Windows Forms does not use COM, many components of the OS such as system dialogs do use this technology.

关于c# - 为什么在控制台应用程序中使用 CommonOpenFileDialog 时会出现此异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56892605/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com