我有一個WinForms C#Visual Studio 2008(.NET 3.5)解決方案將升級到Visual Studio 2010(.NET保持在3.5版本)。此解決方案利用Vista API中的FileDialog有兩個原因:調試利用Vista API中的FileDialog的Visual Studio 2010解決方案問題
- 在Windows XP中運行應用程序時,期望爲用戶提供Windows XP外觀文件對話框。在Windows Vista和7中運行相同的應用程序時,文件對話框應具有Vista外觀。
- 更重要的是,我們的應用程序允許用戶打開一個項目文件,該文件可以是本地文件(存儲在用戶機器上或USB設備上)或服務器項目(託管在MS SQL Server中)。爲了實現這一點,我們使用Vista API,因爲我們可以訪問文件類型下拉列表控件的事件處理程序。因此,實現是爲用戶提供打開的文件對話框,當他們從文件類型下拉列表中選擇「服務器」選項時,打開的文件對話框關閉,並打開一個不同的對話框,允許用戶選擇他們希望連接的服務器和服務器項目。
在Visual Studio 2008中調試應用程序時,Vista API沒有任何問題。當解決方案升級到Visual Studio 2010(在Windows 7中運行)時,用戶嘗試調試應用程序,並且用戶希望訪問Vista API打開文件對話框,應用程序崩潰時會拋出ArgumentException,並顯示以下消息: 「價值不在預期範圍內」。當用戶在沒有從Visual Studio 2010進行調試(Ctrl + F5)的情況下運行解決方案時,奇怪的是沒有發生異常。 「違規」代碼是:
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);
}
我試過一些谷歌搜索,但無濟於事。我已經提供了帶有Vista API的示例Visual Studio 2010解決方案,並且此解決方案中也存在此問題。示例項目可以從here下載(ZIP格式)。要重現該問題:
- 調試在Visual Studio 2010
- 的解決方案一旦「Vista的API演示」推出後,點擊「對話框」選項卡上。
- 從位於「對話框」選項卡右側的「Vista Look」列中,單擊「打開文件」按鈕。
- 將顯示一條消息「文件類型已更改爲1」的對話框。點擊確定按鈕。
- 注意到此時應用程序崩潰,clsFileDialog.cs中的DoFolderChange(IFileDialog)方法拋出異常。
我對這篇冗長的文章感到抱歉,但我需要解釋爲什麼需要Vista API文件對話框實現的整個背景。我很感謝解決此問題的任何幫助,因爲我的開發團隊正在考慮與Visual Studio 2010合作,並且我們的開發人員不希望擺脫附加和分離調試器的作用,只是爲了繞過此問題。
感謝您的答覆granadaCoder。說實話,我還沒有看過這個問題一段時間,但我的一個同事也找到了解決我的問題。儘管我沒有看到他的修復的確切性質,但他發現在代碼中有一些我們沒有使用的事件,所以他沒有註冊這些事件並且沒有發生崩潰。當我接下來有機會的時候,我會看看我的同事以及你的同事。再次感謝! – 2011-05-22 11:43:41