场景 : 我创建了一个库项目,它为安装程序提供接口(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 + @"MyFolder1MyFolder2";
假设您正在运行由 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。
根据您使用的安装盾版本,尝试不同的属性
1. SRCDIR
2. 安装执行
3. 支持目录
如果你有一个 C# 代码来读取准备,请使用 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);