[英]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.