10

我使用 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
}

所以当代码部署时,我们偶尔会去页面,并不会从嵌入的文档中加载任何内容。当我们检查事件日志时,没有错误。如果用户只是刷新页面,它将正常加载。这让我认为,出于某种原因,assembly = Assembly.GetExecutingAssembly();偶尔会返回 null,而代码的编写方式并不是错误。所以,我的问题是为什么会Assembly.GetExecutingAssembly();返回 null?我发现了几篇关于非托管代码有时会出现错误的文章,但这个应用程序是用 C# 编写的,并通过安装项目进行部署。

该代码最初是在没有错误避免代码的情况下编写的。添加它是为了防止用户收到错误屏幕。异常会写入服务器的事件日志。

4

6 回答 6

6

这是一个完美的例子,说明为什么吃异常是一个几乎普遍的坏主意,尤其是顶级System.Exception. 问题可能在任何地方。更有可能的是,真正的问题在于您的日志记录代码。

取出那些空catch块(或用 重新抛出它们throw;)并查看异常真正发生的位置。一旦你发现了真正的问题并重写了你的代码,就重写它以只捕获你真正知道如何处理的异常。

GetExecutingAssembly不会回来null,期间。

于 2010-03-04T01:25:57.693 回答
5

转到提到其路径的文件的属性,并将 buildAction 从默认内容更改为 EmbeddedResource。重新编译,它应该工作。

于 2011-11-16T11:05:53.577 回答
3

如果您从非托管应用程序(例如 NUnit 测试运行程序)启动代码,则可能返回 null:使用控制台尝试以下操作:

[Test]
public void att()
{
    Assert.NotNull(Assembly.GetExecutingAssembly());
}

看到您已将其标记为嵌入,我猜您正在使用某种引导加载程序或解释器来运行您的 .Net 应用程序?这可能是不受管理的(即不是.Net 解释的),因此将返回null。

请参阅文档,部分“备注:http: //msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx

于 2014-03-13T00:47:48.900 回答
1

这可能是原因之一 - http://winterdom.com/2003/04/assemblygetexecutingassembly

于 2010-03-09T11:08:48.337 回答
1

当面对这样的情况时,我试图真正证明返回的值是空的。尝试这个:

try
{
    assembly = Assembly.GetExecutingAssembly();
    Log.Write("Executing assembly is null: " + (assembly == null))
}
catch(Exception ex)
{
    //Write exception to server event log
}

我怀疑它总是会写“假”,而实际上是其他问题——也许是你的代码片段中没有包含的问题。

于 2010-03-04T01:24:41.677 回答
0

如果您尝试访问文件,请转到该文件,右键单击它,转到它的属性,将其Build Action更改为“ Embedded Resource ”,然后确保您提供给“ GetManifestResourceStream ”的路径拼写正确. 可空性主要发生在路径/文件的拼写错误时。

于 2021-03-10T11:15:43.833 回答