[英]C# How to get current directory path
场景:我创建了一个库项目,它为安装程序提供接口(使用安装屏蔽创建的 exe)。我想检查安装程序文件夹中是否存在特定文件。
我试过以下:
1). Assembly.GetEntryAssembly().Location
// 抛出“未将对象引用设置为对象的实例”
2). new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath
// 返回:C:\\Windows\\Microsoft.Net\\assembly\\GAC_32\\mscorlib\\v4.0_4.0.0.0__b77a5c561934e089\\mscorlib.dll
3). Assembly.GetExecutingAssembly().Location
// 返回空字符串
4). AppDomain.CurrentDomain.BaseDirectory
// 不考虑实际路径,返回“C:\\Windows\\syswow64\\”
谁能告诉我如何从执行安装程序的位置获取目录路径?
您可以使用
Directory.GetCurrentDirectory();
获取当前目录路径
导入System.IO
我将回答我自己的问题,无法从库项目中获取当前路径。 您必须从安装程序中获取它。 没有其他办法。
谢谢你。
如果您想获取您的 exe 所在的文件夹
AppDomain.CurrentDomain.BaseDirectory
这将返回包含 exe 的文件夹的整个路径。 从那里您可以手动添加文件夹
AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
假设您正在运行由 InstallShield 构建的基于 MSI 的安装:
您遇到的问题是因为这些调用的工作方式。 您正在外部 Dll 中实现此功能,而 Dll 没有自己的当前目录 - 它们具有调用 Dll 的进程的当前目录。 在这种情况下,您是从 msiexec.exe 进程调用的(假设您是在自定义操作中执行此操作),因此您将获得 msiexec.exe 的当前目录。
除此之外,还有一些其他的观察:
您没有确切说明何时调用代码,但可能是在用户选择安装文件夹之前,因此搜索并没有真正的帮助。
InstallShield 可能提供对文件搜索的支持。 如果这是 MSI 设置,它肯定可以。
安装几乎不会在安装文件夹中查找文件,因为很少有充分的理由。 如果您需要该文件,请将其添加到您的安装中,或者如果它是可再发行的,则添加标准的 redist 包,可能是一个合并模块。 如果该文件属于另一个设置,如果该产品被卸载,您会怎么做? 您是否正在检查版本以查看它是否与您的应用程序兼容? 一般来说,所有设置都会安装他们需要的文件,如果共享文件被多个不同的产品使用,则它们向后兼容。
试试这个,它总是对我有用:
Environment.CurrentDirectory
使用上述属性如下。
string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);
如果你想在 InstallShield 中使用这个路径
Setup.exe - 使用 SETUPEXEDIR 属性
http://www.installshield.com/news/newsletter/0206-articles/SetupExeDir.asp 。
根据您使用的 installshield 版本,尝试不同的属性
1. SRCDIR
2. 设置目录
3. 支持目录
如果你有一个 C# 代码来读取 preperties 使用 MsiGetProperty 像下面
MsiGetProperty( hMSI, "SETUPEXEDIR", Value, Size )
string assemblyPath = Context.Parameters["assemblyPath"];
int i = assemblyPath.Length - 1;
while (assemblyPath[i] != '\\') --i;
string folder = assemblyPath.Substring(0, i);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.