C# 从Windows服务获取应用程序的BaseDirectory

C# 从Windows服务获取应用程序的BaseDirectory,c#,winforms,windows-services,C#,Winforms,Windows Services,我有一个winform应用程序ABC。我正在使用clickonce在客户端设备上安装它。在它的BaseDirectory中(对于我的应用程序,它是AppData\Local\Apps\xx\yy\zz\)。在zz文件夹中,我有一个zip文件夹,我需要从windows服务访问它。是否有任何方法可以从win服务获取AppData位置?有可能吗?我假设这是不可能的,因为这意味着第三方可以影响应用程序。这是部分可能的。您可以使用以下方法从服务代码获取客户端系统上的appdata本地目录: var p =

我有一个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上的其他枚举值,以获取

的信息。最好的选择似乎是注释中建议的,请在安装后将其保存在注册表中,并使用您的服务检索它

另一种选择可能是使用MSI,并且在其上有一个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.
    }
}

一旦您验证了服务可以通过硬编码访问路径,应用程序是否会在每次启动时将路径写入注册表?@AlexK.+1表示注册表想法。现在我正在写一个文本文件的路径作为一种解决方法。我仍然想知道是否有办法获取应用程序的数据位置。问题是我不知道“xx/yy/zz”位,这是在飞行中创建的。然后答案是不,这是不可能的。除非您可以使用相同的精确算法重新创建“动态”部分。也就是说,如果它使用的是公司/应用程序/版本或一些可复制的模式。看起来很酷。我正试图了解其中的情况,看看我是否可以在代码中实现它,而无需在解决方案中引入一个全新的项目。我们决定在项目中选择registry选项,因此我没有深入研究这个MSI包装器。但是,您始终可以选择直接导入项目中的类(从而将它们放在子文件夹或其他东西中),以保持项目整洁。这将避免需要链接一个单独的项目,如果你不想这样做。另一个选项是构建MSI包装并链接DLL文件。好主意,我仍然不确定是否要创建注册表,因为我不确定应用程序在客户端设备中是否具有该权限。但这似乎是迄今为止最干净的解决方案。