C# 从其他应用程序启动可执行文件时未找到文件
在我的应用程序中,在用户登录后,我设置了一些picturebox/button/etc图像,并对它们进行缩放等等。我使用相对路径,例如:C# 从其他应用程序启动可执行文件时未找到文件,c#,executable,relative-path,filenotfoundexception,C#,Executable,Relative Path,Filenotfoundexception,在我的应用程序中,在用户登录后,我设置了一些picturebox/button/etc图像,并对它们进行缩放等等。我使用相对路径,例如: @".\Images\SomeImage.png" 直接启动应用程序时,它可以正常工作,但如果您尝试通过其他应用程序运行它: Process process = new Process(); process.StartInfo.FileName = networkPath; process.Start(); 它死了,并出现了一个文件未找到错误,因为它无法找
@".\Images\SomeImage.png"
直接启动应用程序时,它可以正常工作,但如果您尝试通过其他应用程序运行它:
Process process = new Process();
process.StartInfo.FileName = networkPath;
process.Start();
它死了,并出现了一个文件未找到错误,因为它无法找到图像。如果我尝试通过命令提示符启动它,它也会这样做。可执行文件存储在网络驱动器上。为什么相对路径在这种情况下不起作用?我可以继续硬编码完整的路径,但这会让我感觉脏兮兮的。。。有什么想法吗?您需要将属性设置为正确的路径
您发布的路径:
@".\Images\SomeImage.png"
不是网络路径(它不是UNC或使用映射的驱动器)。这是因为工作目录不同-在启动新进程时,默认情况下,新进程的工作目录设置为现有进程的工作目录(这可能是现有应用程序所在的目录) 通常,您的应用程序将以工作目录作为包含可执行文件的目录运行-例如,这是创建新快捷方式时的默认设置(您可以在“开始位置”字段下的快捷方式属性中看到) 但是,当您的应用程序从命令提示符或其他应用程序运行时,工作目录将发生更改,并且相关路径将解析为完全不同的目录 您可以将调用应用程序更改为将新进程的属性设置为它期望的值,但是正确的修复方法是修改您的应用程序,使其基于可执行文件的路径使用绝对路径。
Assembly.getExecutionGassembly().Location
可用于获取正在运行的可执行文件的路径,因此以下代码应该可以实现此目的:
static string GetAbsolutePathFromRelative(string RelativePath)
{
string directory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string absolutePath = Path.Combine(directory, RelativePath);
// This final call is to stop paths like "C:\Dir\..\OtherDir\file.txt" being returned
return Path.GetFullPath(absolutePath);
}
与应用程序可执行文件相关的路径是什么?