1

我有一个 Silverlight 应用程序,我在其中执行以下操作来加载 XML 文件,并进一步解析它。

我已将构建操作设置为嵌入式资源,复制到输出目录。
我正在使用的代码是:

try
            {
                Xmlfile = XDocument.Load(Assembly.GetExecutingAssembly().GetManifestResourceStream("file.xml"));
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

我收到的异常消息:
值不能为空。
参数名称:输入

编辑

我尝试了以下方法(在 WPF 中),但在 Silverlight 中出现问题:

Assembly.GetExecutingAssembly().GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name + ".file.xml")

错误:

'System.Reflection.Assembly.GetName()' is inaccessible due to its protection level
4

2 回答 2

1

您将需要在程序集及其子文件夹的名称前面添加,如下所示:

string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
XDocument.Load(assemblyName + ".subfolder.file.xml");

有时不清楚子文件夹应该是什么。如果是这种情况,只需使用以下命令直接检查名称:

string[] names = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
于 2012-04-05T08:11:25.993 回答
1

我还没有答案,但前置“解决方案”不适用于 Silverlight 5 应用程序。

如果您使用 Silverlight 5.0 项目编译提供的代码,您将得到“System.Reflection.Assembly.GetName()”由于其在编译时的保护级别而无法访问。

作为记录,我收到类似的错误:

System.Reflection.Assembly.GetName();
System.Reflection.Assembly.GetEntryAssembly()
<someAssembly>.GetReferencedAssemblies()

对于其他 GetName() 重载,您会收到相同的保护错误。

<someAssembly>.GetType(fullyQualifiedTypeName, false, true);

'System.Reflection.Assembly.GetType(string, bool, bool)' 由于其保护级别而无法访问

我怀疑保护级别错误源于 Silverlight 应用程序只是部分受信任的代码,而反射本质上需要高度信任。但是,最后我只是猜测微软代码墙的背后是什么。

MSDN 上或某处是否有文章描述了在合并到 Silverlight 5 Web 应用程序时禁用/保护的 C# 反射相对于程序集的哪些部分?

于 2012-09-25T15:00:00.253 回答