内容简介:在 dotnet 有很多方法可以获取当前程序所在的路径,但是这些方法获取到的路径有一点不相同,特别是在工作路径不是当前的程序所在的路径的时候通过下面几个方法都可以拿到程序所在的文件夹或程序文件如写一个 SetereBojerhis 控制台程序,将这个程序放在
在 dotnet 有很多方法可以获取当前程序所在的路径,但是这些方法获取到的路径有一点不相同,特别是在工作路径不是当前的程序所在的路径的时候
通过下面几个方法都可以拿到程序所在的文件夹或程序文件
- AppDomain.CurrentDomain.BaseDirectory 当前程序域寻找 dll 的文件夹
- Environment.CurrentDirectory 当前工作文件夹
- Assembly.GetCallingAssembly().Location 调用当前函数的函数的程序集的文件
- Assembly.GetEntryAssembly().Location 入口函数程序集所在的文件
- Assembly.GetExecutingAssembly().Location 包含当前代码的程序集的文件
- Directory.GetCurrentDirectory 当前工作文件夹
如写一个 SetereBojerhis 控制台程序,将这个程序放在 D:\lindexi\dotnet 获取程序所在路径的方法\
然后双击运行这个程序,可以看到下面代码
AppDomain.CurrentDomain.BaseDirectory=D:\lindexi\dotnet 获取程序所在路径的方法\ Environment.CurrentDirectory=D:\lindexi\dotnet 获取程序所在路径的方法 Assembly.GetCallingAssembly().Location=D:\lindexi\dotnet 获取程序所在路径的方法\SetereBojerhis.exe Assembly.GetEntryAssembly().Location=D:\lindexi\dotnet 获取程序所在路径的方法\SetereBojerhis.exe Assembly.GetExecutingAssembly().Location=D:\lindexi\dotnet 获取程序所在路径的方法\SetereBojerhis.exe Directory.GetCurrentDirectory()=D:\lindexi\dotnet 获取程序所在路径的方法 AppDomain.CurrentDomain.SetupInformation.ApplicationBase=D:\lindexi\dotnet 获取程序所在路径的方法\ Process.GetCurrentProcess().MainModule.FileName=D:\lindexi\dotnet 获取程序所在路径的方法\SetereBojerhis.exe
虽然看起来大多数的值都是相同的,但是还是有很多区别
Assembly.GetCallingAssembly
获取调用这个函数的函数,如 Foo 函数里面调用了 Assembly.GetCallingAssembly
方法,那么将会返回调用 Foo 函数的函数所在程序集的文件路径
如存在程序集 A1 里面的 M1 方法,在 M1 方法调用 Assembly.GetCallingAssembly
方法。此时在程序集 A2 的 M2 方法调用了 M1 那么将会返回 M2 方法所在的程序集 A2 的文件
但是还有一个要求是 M1 方法不是内联到 M2 方法里面,如果进行内联,那么会让实际的 IL 在 M2 里面,也就是相当于是 M2 方法里面调用 Assembly.GetCallingAssembly
方法,不让一个方法作为内联可以使用 MethodImplOptions 特性
[MethodImpl (MethodImplOptions.NoInlining)] public static void OtherMethod () { //这个方法将不会被内联 }
Assembly.GetEntryAssembly
获取入口程序集,一般的入口程序集就是包含 Main 函数的程序集,一个程序里面是可以存在多个 Main 函数,具体调用哪个可以在编译的时候指定,详细请看 .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换 - walterlv
通过在任意代码调用 Assembly.GetEntryAssembly 可以拿到当前调用的入口函数所在的程序集
但是这个方法相对使用的性能比较多,如果在调用 Assembly.GetEntryAssembly
方法所在的程序集和入口函数在不同程序集,那么性能将会比较差
同时如果是由非托管调用的函数,也就是入口函数不是托管代码那么调用 Assembly.GetEntryAssembly
将会返回空
Assembly.GetExecutingAssembly
获取当前运行代码的程序集,如我在 Foo 方法调用 Assembly.GetExecutingAssembly
那么将会返回调用的代码所在的程序集
static void Foo() { // Get the currently executing assembly. Assembly currentAssembly = Assembly.GetExecutingAssembly(); Console.WriteLine("Currently executing assembly:"); Console.WriteLine(" {0}\n", currentAssembly.FullName); }
性能
已经几个获取方法的性能对比
Method | Mean | Error | StdDev | Median |
---|---|---|---|---|
AppDomainCurrentDomainBaseDirectory | 781.5 ns | 19.489 ns | 23.200 ns | 781.4 ns |
EnvironmentCurrentDirectory | 497.8 ns | 10.076 ns | 25.464 ns | 486.2 ns |
AssemblyGetCallingAssemblyLocation | 3,550.6 ns | 20.228 ns | 17.932 ns | 3,555.4 ns |
AssemblyGetEntryAssemblyLocation | 2,783.2 ns | 33.407 ns | 31.249 ns | 2,791.1 ns |
AssemblyGetExecutingAssemblyLocation | 3,021.7 ns | 32.517 ns | 30.416 ns | 3,018.8 ns |
DirectoryGetCurrentDirectory | 472.2 ns | 3.871 ns | 3.621 ns | 471.4 ns |
AppDomain.CurrentDomain.SetupInformation
关于 AppDomain.CurrentDomain.SetupInformation 和 Process.GetCurrentProcess().MainModule.FileName 的方法请看
三种方法获取可执行程序的文件路径(.NET Core / .NET Framework) - walterlv
参考文档
Assembly.GetEntryAssembly Method (System.Reflection)
Assembly.GetExecutingAssembly Method (System.Reflection)
以上所述就是小编给大家介绍的《dotnet 获取程序所在路径的方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- python获取当前路径
- asp获取虚拟目录根路径的代码
- xcode – 如何在Mac上获取最新SDK的路径
- Scala在资源文件夹中获取文件的文件路径
- 用JavaScript实现basename获取路径中的文件名
- Spring Security 实现 antMatchers 配置路径的动态获取 原 荐
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
松本行弘的程序世界
松本行弘 / 柳德燕、李黎明、夏倩、张文旭 / 人民邮电出版社 / 2011-8 / 75.00元
《松本行弘的程序世界》是探索程序设计思想和方法的经典之作。作者从全局的角度,利用大量的程序示例及图表,深刻阐述了Ruby编程语言的设计理念,并以独特的视角考察了与编程相关的各种技术。阅读《松本行弘的程序世界》不仅可以深入了解编程领域各个要素之间的关系,而且能够学到大师的思考方法。 《松本行弘的程序世界》面向各层次程序设计人员和编程爱好者,也可以供相关技术人员参考。一起来看看 《松本行弘的程序世界》 这本书的介绍吧!