Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取C#程序集的调用目录?_C# - Fatal编程技术网

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

如何获取C#程序集的调用目录?,c#,C#,我正试图编写一个小型构建事件实用程序来读取代码的当前程序集版本 因此,我希望该可执行文件位于我的%PATH%(或至少位于某个中心位置),并且能够将指向目标程序集的相对路径作为参数(指向assembly.LoadFile()它),但assembly.LoadFile()会抱怨接收到相对路径 我怎样做: C:\calling\path>mytool rel\path\to\target.exe 不必每次都键入C:\devpath\to\mytool.exe 并且能够在mytool.exe中获取字符串

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

因此,我希望该可执行文件位于我的%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。无法获取未处理的进程的StartInfo.Start(),包括您自己的进程

要检索“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\添加到路径中

,从您的答案来看,我认为您的问题缺少一些关键元素。例如,您在回答中谈到复制文件,但我不明白您的问题为什么需要这样做。这基本上是因为不希望在任何地方都写入完整路径,也不希望每个工具都有一个充满特定目录(如C:\Program Files(x86)\Organization\Program\version\tools\)的路径。