繁体   English   中英

如何获取 C# 程序集的调用目录?

[英]How to get the calling directory of a C# assembly?

我正在尝试编写一个小型构建事件实用程序来读取我的代码的当前汇编版本。

因此,我希望该可执行文件位于我的 %PATH% (或至少某个中心位置)中,并且能够将目标程序集的相对路径作为参数(到 Assembly.LoadFile() 它)但是 Assembly.LoadFile( ) 抱怨接收到相对路径。

我能怎么做:

C:\calling\path>mytool rel\path\to\target.exe

无需每次都输入 C:\devpath\to\mytool.exe?

并且能够在 mytool.exe 中获取字符串“C:\calling\path\rel\path\to\target.exe”?

事实证明,这有点痛苦。

C# 程序集要求其支持文件与自身位于同一目录中,因此在简单的情况下,我们不能只将 exe 复制到我们选择的目录中。

另一种可能性是创建 exe 的快捷方式并将其移动到目录中。 不幸的是,尽管有大量的“当前”路径获取器,但 C# 无法知道它是否是通过快捷方式启动的。

从 C:\calling\path 中的快捷方式调用时,以下所有内容:

Console.WriteLine(Environment.CurrentDirectory);
Console.WriteLine(Directory.GetCurrentDirectory());
Console.WriteLine(Assembly.GetEntryAssembly().Location);
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.AppContext.BaseDirectory);
//Console.WriteLine(Process.GetCurrentProcess().StartInfo.WorkingDirectory);
Console.WriteLine(Process.GetCurrentProcess().MainModule.FileName);
Console.WriteLine(Environment.GetCommandLineArgs()[0]);

返回“C:\devpath\to”的变体。 除了只是崩溃的 Process.StartInfo 。 您无法获取您没有 Process.Start() 的进程的 StartInfo,包括您自己的。

似乎能够检索“C:\calling\path”的唯一方法是在“C:\inpath”中创建一个直接调用原始程序集的批处理文件。

所以:C:\inpath\exe.bat:

C:\devpath\to\mytool.exe %*

C:\devpath\to\mytool.cs:

Console.WriteLine(Environment.CurrentDirectory);
Console.WriteLine(Directory.GetCurrentDirectory());

这 2 个将返回“C:\calling\path”。

另一种选择可能是将 C:\devpath\to 自身添加到 PATH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM