C# GetManifestResourceStream()在调试器中返回NULL
我在我的应用程序中嵌入了一些XML资源,它可以加载XSD文件,但不能加载XML文件。这就是我加载XSD文件的方式C# GetManifestResourceStream()在调试器中返回NULL,c#,.net,visual-studio-2010,debugging,embedded-resource,C#,.net,Visual Studio 2010,Debugging,Embedded Resource,我在我的应用程序中嵌入了一些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
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进行了双重检查,以查看资源是否真的存在,以及我期望的名称
我还进行了三次检查,确保构建操作
设置为嵌入式资源
,但没有任何效果。我提醒您,当我在调试器外部运行exe并且可以打印XML时,它工作正常。但在使用调试器运行时,它返回null,程序崩溃
是什么原因导致
GetManifestResourceStream()
仅在调试时返回null?问题是我正在从Main()
运行代码。各国的文件:
返回调用当前执行方法的方法的程序集
调用myMain()
方法的程序集
当然是调试器。调试器没有我想要的资源,因此崩溃了。LoadXsdResource()
方法之所以有效,是因为调用程序集是我的,并且具有我想要的资源
我想要的是:
获取包含当前正在执行的代码的程序集。
如果我把我的代码放在一个类中,这就不会发生。我想我是因为愚蠢而纳税的。
Assembly.GetCallingAssembly()
确实是个问题。调试时,Visual Studio宿主进程调用代码,yourapp.vshost.exe
。当然,它不包含您的资源
解决方法是项目+属性、调试选项卡,取消选中“启用VisualStudio宿主进程选项”。当然,真正的解决办法是更加注意代码的位置和资源的位置,使
getExecutionGassembly()
成为最可能正确的选择。当文件名路径错误时,它返回null。它变成了这样的完整路径
System.IO.Stream s=b.GetManifestResourceStream(“TestApp.XML.test.XML”)
上面的示例显示了映射完美路径的最佳方法。在调试器中运行时,调用程序集是什么?(我会把它作为一个局部变量取出来,然后先检查一下。)是的,乔恩,我刚刚考虑过。因为我愚蠢地从
Main()
调用我的代码,所以调用的程序集就是调试器。我想要getExecutionGassembly()
。。。总是这些小事花费了我最多的时间。
Nanespace.FileFolderName.xmlfilename.xml
TestingEnvironmentNamespace.Test.test.xml