[英]GetManifestResourceStream() returning NULL in debugger
我在我的应用程序中嵌入了一些XML资源,它可以加载XSD文件,但不能加载XML文件。 这是我加载XSD文件的方式。
private static XmlSchema LoadXsdResource(string folder, string xsdName)
{
string filename = string.Format("Namespace.{0}.{1}.xsd", folder, xsdName);
using (Stream stream = Assembly.GetCallingAssembly().GetManifestResourceStream(filename))
{
return XmlSchema.Read(stream, (o, e) =>
{
log.Warn(string.Format("Napaka pri parsanju XSD sheme {0}: {1}: {2}", e.Severity, e.Message, filename));
});
}
}
在其他地方我加载XML:
XDocument xdoc = XDocument.Load(Assembly.GetCallingAssembly().GetManifestResourceStream("Namespace.Resources.Oddaja.xml"));
这也有效,但前提是我运行已编译的程序集。 当我使用调试器运行它时,我得到一个来自GetManifestResourceStream()
的NullReferenceException
。
所以我搞砸了命名空间,对吧? 不,我检查并仔细检查。 命名空间是正确的,如果不是,我将在正在运行的程序集中获得异常。 (每当发生异常时我都会记录)我还会使用.NET Reflector进行双重检查,看看资源是否真的存在我想要的名称。
我还检查了三次并确保Build Action
设置为Embedded Resource
但没有任何效果。 我提醒你,当我在调试器外部运行exe时,它可以正常打印XML。 但是,当使用调试器运行时,它返回null并且程序崩溃。
什么可能导致GetManifestResourceStream()
仅在调试时返回null?
问题是我从Main()
运行我的代码。 Assembly.GetCallingAssembly()
的文档说明:
返回调用当前正在执行的方法的方法的程序集。
该Assembly
是调用我Main()
方法当然是调试器。 调试器没有我想要的资源而且崩溃了。 LoadXsdResource()
方法有效,因为调用程序集是我的并具有我想要的资源。
我想要的是Assembly.GetExecutingAssembly()
:
获取包含当前正在执行的代码的程序集。
如果我将我的代码放在一个类中,这将不会发生。 我想我因为愚蠢而缴税。
Assembly.GetCallingAssembly()
确实是个问题。 在进行调试时,Visual Studio托管进程yourapp.vshost.exe
将调用您的代码。 这当然不包含您的资源。
解决方法是Project + Properties,Debug选项卡,取消选中“启用Visual Studio主机进程选项”。 但当然真正的解决方法是更多地关注代码的位置与资源的位置,使得GetExecutingAssembly()
成为最可能的正确选择。
它的文件名路径错误时返回null。 它变成了完整的路径,就像这个System.IO.Stream s = b.GetManifestResourceStream(“TestApp.XML.test.xml”);
Nanespace.FileFolderName.xmlfilename.xml
TestingEnvironmentNamespace.Test.test.xml
上面的例子展示了如何绘制完美路径的最佳方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.