2012-08-13 90 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