空引用异常与System.Reflection.Assembly

18

我开发了一个用于内部邮件报告的库。 当我从另一个项目中使用该库(通过添加引用)时,会在以下行上出现 NullReferenceException

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

有什么想法,为什么Assembly是null吗?


5
这适用吗?从Assembly.GetEntryAssembly:当一个托管程序集从非托管应用程序中加载时,GetEntryAssembly方法可能会返回“Nothing”。 - Ani
非托管代码?两个应用程序都是在相同版本的 .net 中开发的。 - Scorpion
@Ani,我认为它是被管理的,因为这两个应用程序都是在.NET 3.5下开发的,并且都在同一个源代码控制下。 - Scorpion
当我通过Resharper单元测试GUI运行单元测试时,我遇到了相同的问题。 - Eugeniu Torica
@Jenea,你找到解决方案了吗? - Scorpion
很遗憾我没有去找答案。因此我也对答案很感兴趣。 - Eugeniu Torica
3个回答

28

这在Windows服务中是很常见的情况,尤其是当它们被非托管运行时加载时。

请使用:

  Process.GetCurrentProcess().MainModule.FileName

获取未托管的入口点文件。


更新

看起来你正在寻找这个:

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

2
加载器是IIS,它不是托管的。你为什么需要EntryAssembly?你可以使用Process.GetCurrentProcess().MainModule.FileName来找出它是哪个未托管的入口点。 - Aliostad
应用程序的名称是什么?你是指Web应用程序吗?你的问题需要一些改进,伙计。 - Aliostad
抱歉@Aliostad,是的,想要获取Web应用程序的名称和版本。 - Scorpion
请看我的更新。HTTP应用程序的名称是IIS特定的,您不能使用ASP.NET来获取它。 - Aliostad
@Aliostad,我已经通过使用Assembly.GetAssembly(ex.TargetSite.DeclaringType.UnderlyingSystemType).GetName().Name解决了我的问题。我已经将Exception(ex)作为参数。非常感谢您的帮助。 - Scorpion
显示剩余3条评论

2
问题已经解决了,
我正在使用
Assembly.GetAssembly(ex.TargetSite.DeclaringType.UnderlyingSystemType).GetName().Name 

获取EntryAssemblyName。
在这种情况下,我已经有一个参数'ex'来接受异常,所以我通过使用它来解决它。

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

干杯


2
Aliostad已经回答了这个问题。让程序崩溃以获取结果并不是一个好的做法。你可以简单地遵循Aliostad更清晰的方法:System.Reflection.Assembly.GetExecutingAssembly().GetName().Name - Leo Gurdian
@Scorpion,有没有其他方法可以获取顶级父程序集/ dll名称?除了通过ex之外。 - Neeraj Kumar Gupta

0
回答OP和@Neeraj的问题:有时候使用Assembly.GetExecutingAssembly().Location获取程序集的根目录也是很有用的(例如,当Resharper测试运行器在使用GetEntryAssembly()时让你感到困扰时)。
string rootDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string someFile = Path.Combine(
            rootDir ?? throw new InvalidOperationException(),
            "Foo",
            "Bar.txt");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接