Nat*_*han 8 c# assemblies embedded-resource system.reflection
我使用xml文件作为嵌入式资源来加载XDocument.我们使用以下代码从程序集中获取相应的文件:
XDocument xd = new XDocument();
Assembly assembly = null;
try
{
assembly = Assembly.GetExecutingAssembly();
}
catch(Exception ex)
{
//Write exception to server event log
}
try
{
if(assembly != null)
{
using(StreamReader sr = new
StreamReader(assembly.GetManifestResourceStream("assemblyPath")))
{
using(XmlTextReader xtr = new XmlTextReader(sr))
{
xd = XDocument.Load(xtr);
}
}
}
}
catch(Exception ex)
{
//Write exception to server event log
}
Run Code Online (Sandbox Code Playgroud)
因此,当部署代码时,我们偶尔会转到页面,并且不会从嵌入的文档中加载任何内容.当我们检查事件日志时,没有错误.如果用户只是刷新页面,它将加载正常.这让我认为,由于某种原因,assembly = Assembly.GetExecutingAssembly();偶尔会返回null,并且编写代码的方式不是错误.所以,我的问题是为什么会Assembly.GetExecutingAssembly();返回null?我发现有几篇文章谈到有时会出现非托管代码的错误,但是这个应用程序是用C#编写的,并通过安装项目进行部署.
代码最初是在没有错误避免代码的情况下编写的.添加它是为了防止用户获得错误屏幕.异常将写入服务器的事件日志.
这是一个很好的例子,说明为什么吃异常几乎普遍不好,特别是顶级System.Exception.问题可能在任何地方; 更可能的是,真正的问题在于您的日志记录代码.
取出那些空catch块(或重新抛出在他们里面有throw;),看看那里的异常真的发生.一旦找到真正的问题并重写代码,重写它以捕获实际上知道如何处理的异常.
GetExecutingAssemblynull期间不会回来.
当面对这样的情况时,我尝试真正证明返回的值是空的。尝试这个:
try
{
assembly = Assembly.GetExecutingAssembly();
Log.Write("Executing assembly is null: " + (assembly == null))
}
catch(Exception ex)
{
//Write exception to server event log
}
Run Code Online (Sandbox Code Playgroud)
我怀疑它总是会写“false”,而其他东西实际上是问题所在 - 也许是您没有包含在代码片段中的东西。