Проблема
Я пытаюсь использовать средство выбора папок CommonOpenFileDialog, как описано в этого ответа . Проблема в том, что даже с очень урезанным примером проекта я получаю исключение при попытке использовать функцию ShowDialog()
CommonOpenFileDialog.
Код
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
}
}
}
}
И я также использую следующие пакеты nuget с автором Microsoft:
- 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:
Некоторые другие важные сведения
- Я использую Visual Studio 2015.
- Одна странная вещь в этой ошибке - то, что этот код работал год назад. Я только что снова открыл проект, планируя внести небольшие изменения, и он больше не функционировал.
При создании нового тестового проекта при первом запуске Visual Studio предлагает найти файл с именем CommonFileDialog.cs
.
Исходный каталог, в котором он проверяет наличие файла: «c: \ projects \ Windows API Code Pack 1.1 \ source \ WindowsAPICodePack-NuGet \ Shell \ CommonFileDialogs \ CommonFileDialog.cs», который не существует на моем компьютере.
Если я выберу «отменить», подсказка не будет возвращаться при будущих отладках Я подозреваю, что этот отсутствующий файл является источником проблемы, но не знаю, что делать с этой информацией.
Что я пробовал
Поиск исключений ничего не дал, кроме этого забавного, но неуместного вопроса .
Установка одинаковых пакетов nuget из нескольких источников не дала мне никаких других результатов. Существует довольно много копий пакетов, потому что какое-то время Microsoft делала их недоступными .
Я попытался найти на моем компьютере файл "CommonFileDialog.cs", но его нигде нет.