我们有一个Windows应用程序,可以安装在程序文件中,也可以从其他地方复制和使用。此外,客户经常希望在同一台机器上使用多个版本的应用程序(长话短说:客户有N个项目,每个项目处于不同的阶段,因此每个项目都需要不同版本的应用程序。客户基于它自己的项目在顶部我们的申请/框架)。
我们开始看到客户抱怨运行我们的应用程序需要管理员权限,因为:
我们决定我们应该为此做些什么。可能我们应该把所有这些东西都写到%AppData%/[someFolder]
。问题是客户可能有几个不同的应用实例,他们应该有单独的日志/缓存。客户甚至可能安装了两次相同的版本,因此我们无法将版本用作密钥。
目前的想法是使用Assembly.GetEntryAssembly().Location
作为键,因此写入的路径将类似于$"%AppData%\{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}"
。这可能会奏效,但看起来非常奇怪和黑客。
有没有更好的方法来管理它?我还考虑将每个应用实例发布为GUID并使用它,但我不确定如何正确地执行此操作。
答案 0 :(得分:1)
我决定将我的评论写入答案,因为它们已经是某些人的想法(你似乎要做的事情)。
相对文件夹是一种更简单的解决方案,如果您同时安装了多个版本的软件,那么您不应该有冲突(假设它们都有不同的基本文件夹)或者混淆哪个女巫。
C:\Company Name\Software Name 1.0
C:\Company Name\Software Name 1.1
C:\Company Name\Software Name 2.1
D:\Test\Blablabla
查找软件可执行文件和相应数据非常容易。我个人不喜欢AppData
想法(作为开发人员和用户)主要是因为它引入的混乱,因为软件A
可能会突然将其数据存储在
c:\Users\Current User\AppData\LocalOrLocalLowOrRoamingTryToGuessWhich\SomeWeirdFolderNameToExampleB
通常,安装人员需要检查Windows版本,检查文件夹权限等,以确保应用程序具有正确的环境,但软件也可以在启动时执行此操作,以便在条件允许时至少发出警告没有成功运行。
在我们公司的软件安装程序中,默认情况下会提供C:\Company Name\Software Name Version
文件夹,这对我们的客户来说没问题。
如果你必须使用Program Files
(因为,这也不错),那么,例如Steam客户端将执行某些操作以使其Program Files
内的文件夹可写。
答案 1 :(得分:1)
写入c:\Program Files
或C:\Company Name
都不是好主意,也不符合Windows最佳做法。写入程序文件需要管理员权限才有原因!写入C:\Company Name
是可能的,但仅出于向后兼容性原因并且完全过时。
我的建议是写信至Appdata
,是.\Local
,.\LocalLow
还是.\Roaming
是您的选择,但有最佳做法(read this post)
您也可以使用%Programdata%\YourFolderName
。
为了使程序的实例彼此分开:取任一进程ID(这些在任何给定时间都是唯一的,但不是随着时间的推移),或使用随机数。 GUID是随机数(或随机字符串)的一个示例,但如果GUID看起来很丑,那么4字节(long
)随机数也可以完成这项工作。