我正在尝试编写一个小型生成事件实用程序来读取我的代码的当前程序集版本。
因此,我希望该可执行文件位于我的%path%(或至少某个中心位置)中,并且能够将目标程序集的相对路径作为参数(对assembly.LoadFile()它),但assembly.LoadFile()会抱怨接收到相对路径。
我该如何做:
C:\calling\path>mytool rel\path\target.exe
而不必每次都键入C:\devpath\to\mytool.exe?
并且能够在MyTool.exe中获得字符串“C:\calling\path\rel\path\to\target.exe”?
原来,这是有点痛。
C#程序集要求它的支持文件与它自己所在的目录相同,所以在简单的情况下,我们不能仅仅将exe复制到我们选择的目录中。
另一种可能是创建exe的快捷方式并将其移动到目录中。不幸的是,尽管C#有大量的“当前”路径getter,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”中创建一个批处理文件,直接调用原始程序集。
so: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\添加到路径