这是一个解决方法,使我能够调试我的 ClickOnce 应用程序。在 VS2017 中,访问独立存储时不会收到错误消息“无法确定调用者的身份”。该解决方法也应该适用于需要 ClickOnce 安全设置的任何情况。
要重新创建以前在选中项目属性的“安全”选项卡上的“启用 ClickOnce 安全设置”时生成的设置,请执行以下操作:
1.在项目属性的安全选项卡上取消选中启用 ClickOnce 安全设置
2.将以下内容添加到您的 App.Config 文件中(如果尚未存在)
<runtime>
<NetFx40_LegacySecurityPolicyenabled="true"/>
</runtime>
3.向您的项目添加对Microsoft.Build.Tasks.v4.0的引用
重新创建 ClickOnce 设置的代码可以在任何地方使用,但以下示例 Main 方法说明了总体思路
using System;
using System.Reflection;
using System.Runtime.Hosting;
using System.Security;
using System.Security.Permissions;
using System.Security.Policy;
using System.Windows.Forms;
using Microsoft.Build.Tasks.Deployment.ManifestUtilities;
namespace SecurityDebuggingTest
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (args.Length > 0 && args[0] == "startui")
{
Application.Run(new Form1());
}
else
{
PermissionSet permissions = new PermissionSet(PermissionState.Unrestricted);
string AppName = Assembly.GetEntryAssembly().GetName().Name;
string AppExe = $"{AppName}.exe";
string DebugSecurityZoneURL = $"{AppExe}.manifest";
string AppManifestPath = $"{AppName}.application";
string appType = "win32";
AssemblyIdentity ca = AssemblyIdentity.FromManifest(AppManifestPath);
string appIdentitySubString = $"Version={ca.Version}, Culture={ca.Culture}, PublicKeyToken={ca.PublicKeyToken}, ProcessorArchitecture={ca.ProcessorArchitecture}";
string assemblyIdentity = $"http://tempuri.org/{AppManifestPath}#{AppManifestPath}, {appIdentitySubString}/{AppExe}, {appIdentitySubString},Type={appType}";
System.ApplicationIdentity applicationIdentity = new System.ApplicationIdentity(assemblyIdentity);
ApplicationTrust appTrust = new ApplicationTrust();
appTrust.DefaultGrantSet = new PolicyStatement(permissions, PolicyStatementAttribute.Nothing);
appTrust.IsApplicationTrustedToRun = true;
appTrust.ApplicationIdentity = applicationIdentity;
AppDomainSetup adSetup = new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.BaseDirectory,
ActivationArguments = new ActivationArguments(
ActivationContext.CreatePartialActivationContext(
applicationIdentity,
new string[] { AppManifestPath, DebugSecurityZoneURL })
),
ApplicationTrust = appTrust
};
Evidence e = new Evidence();
e.AddHostEvidence(appTrust);
AppDomain a = AppDomain.CreateDomain("Internet Security Zone AppDomain", e, adSetup, permissions);
a.ExecuteAssembly(AppExe, e, new string[] { "startui" });
}
}
}
}
当您第一次运行上述代码时,您可能会看到有关 VS Hosting 进程不可用的警告消息,但此后项目用户文件中的 EnableSecurityDebugging 设置将被设置为 False,并且代码应该正常运行。
感谢 Microsoft 的 ClickOnce 团队在此解决方法上提供的帮助。