我使用XSD创建了自定义配置部分。为了解析这个新模式之后的配置文件,我用这个加载资源(我的.xsd文件):
public partial class MonitoringConfiguration
{
public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd";
public const string ConfigSchema = "urn:MonitoringConfiguration-1.0";
private static XmlSchemaSet xmlSchemaSet;
static MonitoringConfiguration()
{
xmlSchemaSet = new XmlSchemaSet();
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
XmlReader schemaReader = XmlReader.Create(xsdStream);
xmlSchemaSet.Add(ConfigSchema, schemaReader);
}
}
顺便说一句,我的资源是:MonitoringConfiguration.xsd。而另一个部分类的名称空间(表示.xsd文件后面的代码)是MonitoringAPI.Configuration
。
问题出在这里:
Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
xsdStream为null,所以我觉得无法找到资源!但为什么呢?
谢谢
答案 0 :(得分:90)
资源的名称始终为:
<Base namespace>.<RelativePathInProject>.<FileName>
因此,如果您的资源位于“Resources / Xsd /”中,并且您的默认项目名称空间是“MonitoringAPI.Configuration”,则资源名称为:
"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"
还要确保资源的构建操作设置为“Embedded Resource”
答案 1 :(得分:48)
获取嵌入资源实际名称的简便方法:
string[] resourceNames =
Assembly.GetExecutingAssembly().GetManifestResourceNames();
然后只需检查resourceNames数组,您就会知道要传递给GetManifestResourceStream方法的内容。
答案 2 :(得分:12)
就我而言,
当您尝试通过GetManifestResourceStream()
访问该文件时。由于文件路径无效,您将收到错误,并且流将为空。
<强>解决方案:强>
右键单击已添加到解决方案中的文件,然后单击“属性”。
选择Build Action
为Embedded Resource
。 (而不是Content
- 默认情况下)
答案 3 :(得分:8)
默认情况下,visual studio不会嵌入xsd文件,因此您必须确保将xsd文件的“Build Action”属性设置为“Embedded Resource”以使其正常工作
答案 4 :(得分:5)
只需在form1.resx下添加资源 - &gt;添加现有项目
双击您在Resources folder.go下添加到属性的资源,然后选择“Embedded Resources”而不是“none”。
然后 尝试调试该行:
string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();
检查您添加的资源是否在数组中。然后从这个数组中精确复制资源名称,并尝试将名称放在你的代码上......工作正常!!
答案 5 :(得分:1)
您可以通过传递资源名称获取资源流,如下所示......
获取资源名称,例如..
程序集objAssembly = Assembly.GetExecutingAssembly();
string [] strResourceNames = objAssembly.GetManifestResourceNames();
将资源名称传递给...
Stream strm = objAssembly.GetManifestResourceStream(strResourceNames);
现在你有了Stream,你可以做任何你想做的事......
答案 6 :(得分:0)
就我而言,情况完全不同:
我的UWP App在Debug和Release配置中正确编译,但GetManifestResourceStream仅返回Null Release配置。
问题是,在UWP构建配置文件中(仅在那里)启用了设置&#34;使用.NET Native工具链&#34; 进行编译。禁用后,GetManifestResourceStream按预期工作。
答案 7 :(得分:0)
我有一个问题,我在一堆不同的程序集中嵌入了一堆.xsd文件;一切正常(GetManifestResourceNames正在返回我希望看到的文件),除了一个。没有被称为:
Something.LA.xsd
我没有处理特定的文化,文件名末尾的.LA位被编译器选中,因为这个文件用于LA文化 - 清单中的文件名是以Something.xsd进行的(在文化洛杉矶) - 因此我无法找到它(它最终在卫星装配中)。我通过重命名文件来避开这个问题 - 大概可以明确说明给定嵌入式资源的文化。
实际上,快速谷歌显示: How can I prevent embedded resource file culture being set based on its filename
根据这个答案,你必须做一些hacky事情 - 所以也许重命名文件毕竟不是那么糟糕:)