C# System.Reflection.Assembly出现空引用异常

C# System.Reflection.Assembly出现空引用异常,c#,system.reflection,C#,System.reflection,我开发了一个内部电子邮件报告库。当我从另一个项目中使用该库时(通过添加引用) 它在下一行给出NullReferenceException System.Reflection.Assembly.GetEntryAssembly().GetName().Name 你知道为什么程序集为空吗?这是意料之中的,尤其是在Windows服务中,它们是由非托管运行时加载的 使用: 获取非托管入口点文件 更新 看起来你在寻找这个: System.Reflection.Assembly.GetExecuti

我开发了一个内部电子邮件报告库。当我从另一个项目中使用该库时(通过添加引用)

它在下一行给出
NullReferenceException

System.Reflection.Assembly.GetEntryAssembly().GetName().Name

你知道为什么程序集为空吗?

这是意料之中的,尤其是在Windows服务中,它们是由非托管运行时加载的

使用:

获取非托管入口点文件


更新 看起来你在寻找这个:

  System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

问题解决了,伙计们

我正在使用

Assembly.GetAssembly(ex.TargetSite.DeclaringType.UnderlyingSystemType).GetName().Name 
获取EntryAssemblyName。
在这个例子中,我已经有了一个参数,它接受异常'ex',所以我用它来解决它

非常感谢各位,特别是@Aliostad


干杯

回答OP和@Neeraj的问题:有时使用
assembly.getExecutionGassembly().Location
获取程序集的根目录也很有用(例如,当Resharper测试运行程序在使用
GetEntryAssembly()
时让您的生活变得艰难)


这是否适用?From:当从非托管应用程序加载托管程序集时,GetEntryAssembly方法不能返回任何内容。非托管代码?这两个应用程序都是在同一版本的中开发的。net@Ani,我认为它是可管理的,因为这两个应用程序都是在.net 3.5中开发的,并且都在相同的源代码管理下。我在通过Resharper单元测试GUI运行单元测试时遇到了相同的问题。@Jenea,你找到了解决方案吗?谢谢Aliostad,但是在这种情况下,它是一个从web应用程序使用的.NET库。你知道如何解决这个问题吗?嗯,加载程序是IIS,它没有被管理。为什么需要EntryAssembly?您可以使用Process.GetCurrentProcess().MainModule.FileName找出它是哪个非托管入口点。@Aliostad,Process.GetCurrentProcess().MainModule.FileName提供了完整路径C:\\Program Files\\Common Files\\Microsoft Shared\\DevelopmentServer\\9.0\\WebDev.WebServer.exe,实际上我想知道应用程序的名称。应用程序的名称是什么?你是说网络应用程序吗?你的问题需要一些工作伙伴。对不起@Aliostad,是的。我想知道Web应用程序的名称和版本。Aliostad已经回答了这个问题。为了得到结果而使程序爆炸不是一种好的做法。您可以简单地遵循Aliostad的更干净的方法:System.Reflection.Assembly.GetExecutionGassembly().GetName()。Name@Scorpion是否有其他方法获取顶级父程序集/dll名称?除前,
Assembly.GetAssembly(ex.TargetSite.DeclaringType.UnderlyingSystemType).GetName().Name 
string rootDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string someFile = Path.Combine(
            rootDir ?? throw new InvalidOperationException(),
            "Foo",
            "Bar.txt");