【问题标题】:C# How to get current directory pathC#如何获取当前目录路径
【发布时间】:2019-02-18 21:15:34
【问题描述】:

场景: 我创建了一个库项目,它为安装程序提供接口(使用安装盾创建的 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\”

谁能告诉我如何从执行安装程序的位置获取目录路径?

【问题讨论】:

  • 为什么不使用 InstallScript?然后您可以使用SETUPEXEDIR 属性。见:helpnet.installshield.com/installshield21helplib/helplibrary/…
  • @KBO 我正在尝试从我创建的外部 dll 中实现它。我想从安装程序中获取路径作为最后的手段,因为我会为此更改库的大部分 API 接口。

标签: c# .net path installation


【解决方案1】:

你可以使用

Directory.GetCurrentDirectory();

获取当前目录路径

导入System.IO

【讨论】:

  • Directory.GetCurrentDirectory() 返回“C:\Windows\SysWOW64”路径,我的安装程序正在从桌面运行。
【解决方案2】:

我会回答我自己的问题,无法从库项目中获取当前路径。您必须从安装程序中获取它。没有别的办法。

谢谢。

【讨论】:

    【解决方案3】:

    如果你想获取你的 exe 所在的文件夹

    AppDomain.CurrentDomain.BaseDirectory
    

    这将返回包含 exe 的文件夹的完整路径。从那里您可以手动添加文件夹

    AppDomain.CurrentDomain.BaseDirectory + @"MyFolder1\MyFolder2";
    

    【讨论】:

    • AppDomain.CurrentDomain.BaseDirectory 返回“C:\Windows\syswow64\”路径并且安装程序正在从桌面运行。
    【解决方案4】:

    假设您正在运行由 InstallShield 构建的基于 MSI 的安装:

    您遇到的问题是由于这些调用的工作方式。您在外部 Dll 中实现此功能,并且 Dll 没有自己的当前目录 - 它们具有调用 Dll 的进程的当前目录。在这种情况下,您从 msiexec.exe 进程中被调用(假设您在自定义操作中执行此操作),因此您将获得 msiexec.exe 的当前目录。

    除此之外,还有其他一些观察:

    1. 您没有准确说明调用代码的时间,但可能是在用户选择安装文件夹之前,因此搜索并没有真正的帮助。

    2. InstallShield 可能支持文件搜索。如果这是一个 MSI 设置,它肯定会。

    3. 安装很少会在安装文件夹中查找文件,因为很少有充分的理由。如果您需要该文件,请将其添加到您的安装中,或者如果它是可再发行的,则添加标准的 redist 包,也许是一个合并模块。如果该文件属于另一个设置,如果该产品被卸载,您会怎么做?您是否正在检查版本以查看它是否与您的应用程序兼容?一般来说,所有设置都会安装他们需要的文件,如果共享文件被多个不同的产品使用,则它们是向后兼容的。

    【讨论】:

      【解决方案5】:

      试试这个,它总是对我有用:

      Environment.CurrentDirectory
      

      使用上述属性如下。

      string currentDirectory = Path.GetDirectoryName(Environment.CurrentDirectory);
      

      【讨论】:

      • 即使安装程序位于另一个目录中,它也会返回“C:\Windows\SysWOW64”路径。
      • 我认为,应用程序发布存在问题。验证项目属性的构建。也许你会明白的。
      • 对不起,我不明白。你是说VS构建设置里面有什么设置?
      • 我无法使用 Path.GetDirectoryName(Application.ExecutablePath),我有一个类库项目,Application 类位于 System.Windows.Forms 命名空间中。
      • 是的。但是您现在正在开发哪种应用程序?对于构建验证,右键单击项目并打开有构建的属性。
      【解决方案6】:

      如果您希望 InstallShield 中的该路径使用此路径

      Setup.exe - 使用 SETUPEXEDIR 属性

      http://www.installshield.com/news/newsletter/0206-articles/SetupExeDir.asp.

      根据您使用的 installshield 版本,尝试不同的属性

      1. SRCDIR

      2。 SETUPEXEDIR

      3。支持目录

      如果你有一个 C# 代码来阅读 preperties,请使用 MsiGetProperty,如下所示

      MsiGetProperty(hMSI, "SETUPEXEDIR", Value, Size)

      【讨论】:

      • 这不等于将路径从安装程序传递给dll吗?
      • InstallShield 保留默认属性本身。您可以在操作中使用它。您还可以为任何大型逻辑处理注入 C# 代码。您需要 MsiGetProperty 来访问这些属性。我建议您阅读 InstallShield 文档并尝试一下。
      【解决方案7】:
      string assemblyPath = Context.Parameters["assemblyPath"];
      int i = assemblyPath.Length - 1;
      while (assemblyPath[i] != '\\') --i;
      string folder = assemblyPath.Substring(0, i);
      

      【讨论】:

        猜你喜欢
        • 2014-03-10
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        相关资源
        最近更新 更多