【发布时间】:2022-01-16 15:47:50
【问题描述】:
当我运行 .net exe 时,会创建一个相应的文件夹 C:\Users\UserName\AppData\Local\AppName
在这个文件夹内,创建了另一个文件夹AppName_Url_ABCXYZ
在此文件夹中,为 .net exe 0.2.28.0 的程序集版本创建了另一个文件夹
谁能解释一下windows是如何决定创建二级文件夹AppName_Url_ABCXYZ的?
当我增加我的程序集版本并执行单个文件发布并运行生成的 exe 时遇到问题,会创建一个包含新程序集版本文件夹的新 AppName_Url_ABCXYZ 文件夹。
这会导致问题,因为它破坏了Properties.Settings.Default.Upgrade() 的功能,因为要升级的设置不再位于预期的目录中
好:
-AppData
-Local
-MyApp
-MyApp_Url_ABCXYZ
-0.2.13.0
-0.2.14.0
-0.2.15.0
不好:
-AppData
-Local
-MyApp
-MyApp_Url_ABC1
-0.2.13.0
-MyApp_Url_ABC2
-0.2.14.0
-MyApp_Url_ABC3
-0.2.15.0
更新:
@Richard Deeming 提供的信息表明,appdata 文件夹的哈希部分是这样生成的:
var uri = "file:///" + fullExePath; //or 'assemblyName.CodeBase' if vshost (you can check the 'FriendlyName')
uri = uri.ToUpperInvariant();
var ms = new MemoryStream();
var bSer = new BinaryFormatter();
bSer.Serialize(ms, uri);
ms.Position = 0;
var sha1 = new SHA1CryptoServiceProvider();
var hash = sha1.ComputeHash(ms);
var hashstring = ToBase32StringSuitableForDirName(hash);
这没有意义,因为 exe 路径没有改变
全新的 WPF .net 6 应用程序和增加程序集版本不会出现此问题,因此它是特定于我的应用程序的问题。
在 Windows 资源管理器中检查生成的 exe 并没有帮助,它们看起来相同。
更新:
我一直无法确定为什么我的项目会出现这种情况。我什至不知道如何调试它。我从未对这种行为进行任何有意的更改。
【问题讨论】:
-
你使用的是点击一次吗?
-
没有。只是 VS 中的发布选项
-
AFAIK 它应该可以工作,因为在
Upgrade()的功能中考虑了此类更改。根据this answer,您需要在用户设置中设置一个标志值,以便仅在发布新版本时进行升级;你试过吗?你能准确地发布你如何调用Upgrade()方法吗? -
完全如该答案中所述。问题是生成的 appdata 文件夹被放入一个仅包含该版本的新文件夹中。以前的版本在它自己的文件夹中。
Upgrade()方法似乎只适用于同一文件夹中的版本,因此我的问题 -
您使用的是 .NET Framework 还是新堆栈(又名 .NET Core)?