定义文件的安装位置

本文关键字:位置 安装 文件 定义 | 更新日期: 2023-09-27 17:59:42

我正试图将.NET应用程序部署为ClickOnce应用程序,但在定义应用程序的安装位置时遇到了问题。我需要知道这一点,因为我必须包括支持文件。我已经将支持文件添加为"现有项目"。我曾以为这个程序会安装在程序文件中,但它并不存在。相反,桌面上只有一个快捷方式。有人能解释一下如何/在哪里使用VS2012定义安装路径吗?

定义文件的安装位置

我发现的一个解决方案是使用一些Application类属性来确定ClicOnce在哪里安装了我的程序实例。但请注意,有些程序在卸载时会被删除。

// To get the path for the executable file that started the application, not including the executable name.
PATH_RESOURCES = Application.StartupPath ;

对于持久数据,我创建了对特定路径的引用,如:

PATH_USERDATA = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"'myAppName'";
        if (!System.IO.Directory.Exists((string)PATH_USERDATA))
        {
            System.IO.Directory.CreateDirectory((string)PATH_USERDATA);
        }

PATH_REPORTS = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"'myAppName'";
        if (!System.IO.Directory.Exists((string)PATH_REPORTS ))
        {
            System.IO.Directory.CreateDirectory((string)PATH_REPORTS );
        }

Clickonce 应用程序安装在用户配置文件下,而不是程序文件路径下。

在windows Vista和windows 7上,clickonce应用程序路径将位于c:'users'username'AppData'Local'Apps'2.0' 中的某个位置

在Windows XP上,clickonce应用程序路径将位于c:'document and Settings'username'LocalSettings'Apps'2.0' 中的某个位置

请注意,每次安装时Clickonce应用程序的路径都不一样,我发现最好的方法是让你的应用程序将自己的应用程序路径写入注册表项,这样你就可以通过查看注册表来确切地知道应用程序路径在哪里。

正如user831062所指出的,ClickOnce应用程序安装在用户配置文件下,而不是程序文件路径下。因此,每台机器上的安装目录都不同,几乎不可能直接访问。

我被挂断的部分是,我在项目中包含的文件在哪里,更重要的是,我如何访问它们?

好吧,正如本链接中的所述,如果您将文件标记为"数据文件",请在以下位置:

Project Properties > Publish > Application Files > Publish Status

你可以使用类似的东西访问它们

textBox = File.ReadAllLines(ApplicationDeployment.CurrentDeployment.DataDirectory + @"'myFile.txt")).ToList();

如果你不把它标记为"数据文件",而只是一个"包含(自动)",它将只位于安装目录中,可以通过直接调用文件来访问,比如:

textBox = File.ReadAllLines(@"myFile.txt")).ToList();

不管怎样,我花了一个小时左右的时间才找到这个,所以希望它能帮助其他人。

如果您已将文件添加到项目中,请将"构建操作"的属性设置为"内容",并将"复制到输出目录"设置为"始终复制"。这样,这些文件将包含在您的部署中。运行应用程序时,检索程序集的位置,并在项目中包含程序集的同一相对文件夹中查找。例如,如果它们位于构建输出目录(/bin/debug/或/bin/release/)的顶部文件夹中,则它们将与可执行文件包含在同一文件夹中,您可以使用以下方法发现:

System.Reflection.Assembly.GetExecutingAssembly().Location