У меня есть решение WinForms С# Visual Studio 2008 (.NET 3.5), которое должно быть обновлено до Visual Studio 2010 (.NET останется на версии 3.5). Это решение использует FileDialog из API Vista по двум причинам:
В Visual Studio 2008 при отладке приложения нет проблем с API-интерфейсом Vista. Когда решение обновляется до Visual Studio 2010 (работает в Windows 7), пользователь пытается отладить приложение, и пользователь хочет получить доступ к диалоговому окну Open API Vista, приложение вылетает с созданием ArgumentException со следующим сообщением: "Значение не входит в ожидаемый диапазон". Как ни странно, когда пользователь запускает решение без отладки (Ctrl + F5) из Visual Studio 2010, исключений не возникает. "Оскорбительный" код:
internal void DoFolderChange(IFileDialog dialog)
{
IShellItem ppsi = null;
string ppszName = string.Empty;
dialog.GetFolder(out ppsi);
// Exception occurs here
ppsi.GetDisplayName(NativeMethods.SIGDN.SIGDN_FILESYSPATH, out ppszName);
OnFolderChange(ppszName);
}
Я пробовал поиск в Google, но безрезультатно. У меня есть образец решения Visual Studio 2010 с API-интерфейсом Vista, и проблема также возникает в этом решении. Образец проекта можно скачать (в форме ZIP) из здесь. Чтобы воспроизвести проблему:
Мои извинения за длинный пост, но мне нужно было объяснить весь фон, почему требуется реализация диалогового окна API Vista. Я очень благодарен за помощь в решении этой проблемы, так как моя команда разработчиков работает над Visual Studio 2010, и мы не хотим, чтобы разработчики не пытались объединять и отделять отладчик, чтобы обойти эту проблему.
Я наткнулся на это, и я решил исправить в моем случае.
Оригинальный код:
OpenFileDialog fdlg = new OpenFileDialog();
string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/
fdlg.InitialDirectory = tempDirectoryName ;
Nullable<bool> result = fdlg.ShowDialog();
Затем я изменил его на:
OpenFileDialog fdlg = new OpenFileDialog();
string tempDirectoryName = @"..\SomeFolder\"; /* Note, the use of a relative directory*/
string massagedDirectoryName = System.IO.Path.**GetFullPath**(tempDirectoryName);
fdlg.InitialDirectory = massagedDirectoryName; /*Note, this is now the full folder name */
Nullable<bool> result = fdlg.ShowDialog();
И это больше не бомбило меня.
Мой был почти таким же сценарием.
Мой сценарий:
Код был WPF-приложением в VS2008 и работал. (3.5 Framework была целевой структурой) Я преобразован в код в VS2010 (4.0 Framework был Target Framework). Затем возникла новая проблема.
Обе базы кода были запущены в Windows 7 x64.
.............
Моя полная ошибка:
Value does not fall within the expected range.
at MS.Internal.Interop.HRESULT.ThrowIfFailed(String message)
at MS.Internal.AppModel.ShellUtil.GetShellItemForPath(String path)
at Microsoft.Win32.FileDialog.PrepareVistaDialog(IFileDialog dialog)
at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner)
at Microsoft.Win32.CommonDialog.ShowDialog()