什么是确定应用程序位置的适当方式?

6

我正在使用C#编写一个Windows服务,它会启动我另外一个应用程序的多个实例。这个应用程序有可能被安装在机器上的任何位置。那么,如何让服务知道应用程序的安装位置是最好的方式呢?

5个回答

8

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

this.GetType().Assembly.Location

如果您需要定位其他应用程序安装的文件夹,则应向Windows Installer发出请求。
[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();
}

6
如果您的意思是服务启动了一个不同的应用程序,则有以下选项:
  • 使用配置文件配置服务;将路径放在其中
  • 在安装期间将某些内容放入注册表中
  • 使用类似于COM/COM+注册的东西
  • 考虑如果其他应用程序是.NET,则使用GAC(尽管我不是支持者...)
  • 环境变量?
个人而言,我喜欢配置文件选项;它简单易用,易于维护,并允许多个分离(并排)的服务和应用程序安装。

我想更多了解在这种情况下如何利用gac,虽然我意识到其中存在的危险,但是这会起作用吗?那配置文件呢?它会被嵌入吗?如果没有嵌入,服务的配置应该放在哪里? - Firoso
我可能最终会选择配置文件的方法,但我也想更多地了解如何使用GAC。 - MGSoto

1
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窗体。上面的代码行实际上并没有使用任何窗体,应该是没问题的。但是有更简单的方法来获取代码库! - Marc Gravell
抱歉,误解了问题 - 我以为他想获取服务的位置。 - Treb

1

System.Environment.CurrentDirectory


1
在安装过程中编写注册表变量,这样在提供升级时,您可以读取先前编写的值并默认为用户先前选择的文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接