从 Windows 服务获取应用程序的 BaseDirectory
Get BaseDirectory of an application from a Windows Service
我有一个 winform 应用程序 ABC。我正在使用 clickonce 在我的客户端设备上安装它。在它的 BaseDirectory 中(对于我的应用程序是 AppData\Local\Apps\xx\yy\zz\)。在 zz 文件夹中,我有一个 zip 文件夹,我需要从 windows 服务访问它。有什么办法可以从我的 win 服务中获取 AppData 位置?有可能吗?我假设这是不可能的,因为这意味着第三方可以影响应用程序。
部分可能。您可以使用以下方式从您的服务代码获取客户端系统上的 appdata 本地目录:
var p = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
然后您可以添加特定于您的应用程序的部分 ("xx/yy/zz"),因为它不会出现在环境中的任何地方。我建议使用:
Path.Combine(p, "xx/yy/zz/yourfile.zip");
如果上面的特殊文件夹不是你需要的你可以参考msdn上的其余枚举值SpecialFolder Enumeration
最好的选择似乎是 在评论中建议的,在安装时将其保存在注册表中并通过您的服务检索它。
另一个选项可能是使用 MSI,GitHub 上有一个 C# 包装器。
一个例子:
// Look for installed products containing 'Word' in their name and show their installed location
foreach (var p in InstalledProduct.Enumerate())
{
try
{
if (p.InstalledProductName.Contains("Word"))
Console.Out.WriteLine("{0} is intalled in {1}", p.GUID, p.InstallLocation);
}
catch (MSIException ex)
{
// Some products might throw an exception trying to access InstalledProductName propoerty.
}
}
我有一个 winform 应用程序 ABC。我正在使用 clickonce 在我的客户端设备上安装它。在它的 BaseDirectory 中(对于我的应用程序是 AppData\Local\Apps\xx\yy\zz\)。在 zz 文件夹中,我有一个 zip 文件夹,我需要从 windows 服务访问它。有什么办法可以从我的 win 服务中获取 AppData 位置?有可能吗?我假设这是不可能的,因为这意味着第三方可以影响应用程序。
部分可能。您可以使用以下方式从您的服务代码获取客户端系统上的 appdata 本地目录:
var p = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
然后您可以添加特定于您的应用程序的部分 ("xx/yy/zz"),因为它不会出现在环境中的任何地方。我建议使用:
Path.Combine(p, "xx/yy/zz/yourfile.zip");
如果上面的特殊文件夹不是你需要的你可以参考msdn上的其余枚举值SpecialFolder Enumeration
最好的选择似乎是
另一个选项可能是使用 MSI,GitHub 上有一个 C# 包装器。
一个例子:
// Look for installed products containing 'Word' in their name and show their installed location
foreach (var p in InstalledProduct.Enumerate())
{
try
{
if (p.InstalledProductName.Contains("Word"))
Console.Out.WriteLine("{0} is intalled in {1}", p.GUID, p.InstallLocation);
}
catch (MSIException ex)
{
// Some products might throw an exception trying to access InstalledProductName propoerty.
}
}