【问题标题】:What is the proper way to determine an application's location?确定应用程序位置的正确方法是什么?
【发布时间】:2010-11-10 19:31:49
【问题描述】:

我正在用 C# 编写一个 Windows 服务,它会生成我正在编写的另一个应用程序的多个实例。该应用程序有可能安装在机器上的任何位置。让服务知道应用程序所在位置的最佳方式是什么?

【问题讨论】:

    标签: c# .net windows windows-services installation


    【解决方案1】:

    如果您需要找到安装服务的文件夹,可以使用以下代码

    this.GetType().Assembly.Location
    

    如果您需要找到安装了其他应用程序的文件夹,您应该向 Windows 安装程序提出请求

    [DllImport("MSI.DLL", CharSet = CharSet.Auto)]
    private static extern UInt32 MsiGetComponentPath(
        string szProduct,
        string szComponent,
        StringBuilder lpPathBuf,
        ref int pcchBuf);
    
    private static string GetComponentPath(string product, string component)
    {
        int pathLength = 1024;
        StringBuilder path = new StringBuilder(pathLength);
        MsiGetComponentPath(product, component, path, ref pathLength);
        return path.ToString();
    }
    

    【讨论】:

      【解决方案2】:

      如果您的意思是服务启动了一个不同的应用程序,那么;选项:

      • 使用配置文件配置服务;把路径放在那里
      • 在安装过程中在注册表中添加一些内容
      • 使用类似于 COM/COM+ 注册的东西
      • 考虑如果其他应用程序是 .NET,请考虑 GAC(虽然我不是粉丝......)
      • 环境变量?

      就个人而言,我喜欢配置文件选项;它简单且易于维护,并允许多个单独(并排)的服务和应用程序安装

      【讨论】:

      • 我想了解更多关于在这种情况下使用 gac 的信息,尽管我知道这样做的危险性?配置文件呢,它会被嵌入吗?如果它没有嵌入服务的配置应该存在哪里?
      • 我可能最终会使用配置文件方法,但我也想了解更多关于以这种方式使用 GAC 的信息。
      【解决方案3】:
      using System.IO;
      using System.Windows.Forms;
      
      string appPath = Path.GetDirectoryName(Application.ExecutablePath)
      

      这是一个应用程序(上)。

      对于一个 asp.net 项目:

      using System.Web;
      
      HttpContext.Current.Server.MapPath( "place arguments here" );
      

      【讨论】:

      • 服务可以毫无问题地引用 windows 窗体。上面这行实际上并没有使用任何形式,应该没问题。但是有更简单的方法来获取代码库!
      • 抱歉,误解了这个问题 - 我以为他想获取服务的位置。
      【解决方案4】:

      System.Environment.CurrentDirectory

      【讨论】:

        【解决方案5】:

        在安装过程中写入注册表变量,这样在交付升级时您可以读回之前写入的值并默认为用户之前选择的文件夹。

        【讨论】:

          最近更新 更多