2012-08-13 68 views
2

我在我的Silverlight項目中的文件夾中有一個文件。Silverlight中的URI相對資源

我的項目是稱爲顯示

解決方案資源管理結構:

/Resources 
    cube.obj 

我的代碼是:

Uri u = new Uri(@"Display;component/Resources/cube.obj", UriKind.Relative); 
Stream stream = Application.GetResourceStream(u).Stream; 
StreamReader reader = new StreamReader(stream); 

cube.obj具有生成操作設置爲內容是否與自己相關。

我得到的是,在JavaScript的出現並沒有給我太多的幫助在確定問題的一個NullReferenceException。

任何想法?

謝謝!

回答

2

將文件的構建操作設置爲「資源」,而不是「內容」。

NullReferenceExceptionApplication.GetResourceStream(u).Stream到來。 GetResourceStream返回null,因爲該文件不可用,因爲它是錯誤的構建操作。在空引用上訪問Stream然後觸發異常。

編輯:也請確保你的Uri「顯示」;部分是裝配obj文件的程序集的專有名稱。

只是爲了澄清。當您希望將文件放置在XAP文件中時,請使用Content。然後,您可以訪問該文件,而無需使用前綴「顯示;組件」路徑。 (注意:關閉我的頭頂部,我不認爲我已經用這種方式加載了「內容」資源,特別是Application.GetResourceStream,所以我不確定它是否可以工作,但我懷疑它會這樣)。如果在不同的路徑/項目中有相同的文件名,我也懷疑這可能會導致問題。如果您想與多個項目/程序集共享相同的資源/文件,此方法特別有用。

使用Resource會將該文件嵌入內的的程序集DLL中。有了這個,你需要指定要查找的程序集(因此「Display; component」前綴)。但是,如果打包用於Silverlight項目的預編譯程序集或想要以不同方式管理文件,則這是必需的。

+0

我現在得到一個不同的錯誤,Format_InvalidString。我猜這就是你所指的。我如何確定容納obj文件的程序集? – pcaston2 2012-08-13 19:57:04

+0

@ pcaston2它應該是沒有「.dll」擴展名的已編譯的程序集文件名。所以如果你編譯的項目/程序集文件名是「MyProject.View.dll」,那麼你會使用「MyProject.View;組件」 – 2012-08-13 19:58:24

+0

實際上,'GetResourceStream'不會拋出無效的字符串格式異常;只有ArgumentException和ArgumentNullException。 'Uri'構造函數可以拋出一個'UriFormatException',這個可能性就是你所看到的,我認爲我會希望你首先得到它。是否有可能您的文件有一個有效的流,並且您的後續代碼正在讀取失敗的文件? – 2012-08-13 20:04:09

0

你可以嘗試讓你的項目的Silverlight調試,這樣你就可以逐步通過SL代碼,轉到您的項目屬性,然後在調試一路走下來,使Silverlight的調試程序,然後運行項目和你的SL斷點將被擊中。

+0

我正在開發的這個項目最初是一個MVC3應用程序,我在Silverlight應用程序中加入了一段時間,並嘗試了一段時間以使調試功能在使用Chrome時可以正常工作。我不能很幸運地獲得該功能。 – pcaston2 2012-08-13 19:52:31

+0

@ pcaston2 AFAIK,Silverlight調試只適用於Internet Explorer。 – 2012-08-13 19:55:01

+0

我可能是錯的,但我聽說有人使用Chrome取得成功。我VS 2010說,符號沒有加載(必須是我的項目中的配置問題),我已經嘗試過類似的問題IE瀏覽器。跟着一些教程,但從來沒有得到它的工作,很確定我知道問題在代碼中的位置,只是不知道該怎麼做。 – pcaston2 2012-08-13 19:59:44