获取程序集位置,GetAssembly().Location和GetExecutingAssembly().Location哪个更好?

25
请建议如何获取当前程序集的执行位置。
Assembly.GetAssembly(typeof(NUnitTestProject.RGUnitTests)).Location
或者
Assembly.GetExecutingAssembly().Location 

请建议哪一个更好。我可以也使用GetEntryAssembly()吗?


1
你想获取哪个程序集的位置? - Patrick Hofman
2
它们做不同的事情,所以没有最好的一个。 - Dirk
执行汇编时,我需要获取 bin\Debug 路径以计算某些东西。 - Neeraj Dubey
1
如果你需要执行程序集,那么为什么考虑使用除GetExecutingAssembly()之外的其他方法呢? - Mikko Viitala
当你创建一个被调用在Web应用程序或服务中的库时,事情会变得复杂起来。你的项目类型是什么? - Chris S
我的项目类型是 NUnit 测试库 类型,我正在使用 NUnit 项目内部的路径,并在测试开始时获取部署在 bin\debug 中的测试配置。 - Neeraj Dubey
2个回答

55

这取决于你想要什么。

  • Assembly.GetAssembly返回声明type的程序集。
  • Assembly.GetExecutingAssembly返回正在执行当前代码的程序集。
  • Assembly.GetEntryAssembly返回进程可执行文件。请注意,这可能不是您的可执行文件。

例如,假设你的代码在myexecutable.exe中。

trdparty.exe 使用 Assembly.LoadFile加载你的可执行文件并通过反射运行一些代码。

myexecutable.exe使用类型MyClass

但是,trdparty.exe在你的代码中打补丁来使用位于Patch.dll中的新版本的MyClass

因此,现在,如果你独立运行你的应用程序,你将得到这个结果:

Assembly.GetAssembly(typeof(MyClass)) -> myexecutable.exe
Assembly.GetExecutingAssembly() -> myexecutable.exe
Assembly.GetEntryAssembly() -> myexecutable.exe

但是,如果您遇到上述情况,您将获得:

Assembly.GetAssembly(typeof(MyClass)) -> Patch.dll
Assembly.GetExecutingAssembly() -> myexecutable.exe
Assembly.GetEntryAssembly() -> trdparty.exe

因此,作为回应,您应该使用提供所需结果的那个方法。

答案似乎很明显,它是Assembly.GetExecutingAssembly(),但有时不是这样。 想象一下,您正在尝试加载与可执行文件相关联的application.config文件,那么路径很可能是Assembly.GetEntryAssembly().Location,以始终获取“进程”的路径。

就像我说的,这取决于情景和目的。


文档说明:“当托管程序集从非托管应用程序加载时,可以返回null”。 - CaldasGSM
但是我正在使用C#.net,它是托管应用程序。我不知道NUnit dll是托管的还是非托管的。 - Neeraj Dubey
不,这是一个使用C#.net创建的NUnit测试库项目。 - Neeraj Dubey
1
如果你说另外两个正在返回你的dll..并且如果这是你想要的..那么你应该使用Assembly.GetAssembly(typeof(MyClass))或其等效项typeof(Example).Assembly,因为MSDN表示GetExecutingAssembly性能较差。 - CaldasGSM
1
在ASP.NET中,GetEntryAssembly()为空。但在ASP.NET Core中已经设置好了。 - Der_Meister
显示剩余7条评论

-3

这似乎很明显:当您需要执行程序集时,请使用GetExecutingAssembly

有时您可能没有一个,例如在运行Office插件时。您可以改用Assembly.GetAssembly


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