C# VS 2017:已设置安全调试选项,但它需要Visual Studio宿主进程,该进程不可用
我的解决方案(包含十几个项目)在VisualStudio2013中运行良好 在Visual Studio 2017中,我可以打开解决方案并对其进行编译 但如果启动调试,我会系统地收到以下错误消息: 已设置安全调试选项,但它需要Visual Studio 在此调试配置中不可用的宿主进程 安全调试选项将被禁用。此选项可以在中重新启用 安全属性页。调试会话将继续进行,但不会出现错误 安全调试 然后,什么也没发生。什么都不会开始 请注意,这是一个包含多个启动项目(包括一个WPF项目)的解决方案 编辑:C# VS 2017:已设置安全调试选项,但它需要Visual Studio宿主进程,该进程不可用,c#,.net,wpf,visual-studio,visual-studio-2017,C#,.net,Wpf,Visual Studio,Visual Studio 2017,我的解决方案(包含十几个项目)在VisualStudio2013中运行良好 在Visual Studio 2017中,我可以打开解决方案并对其进行编译 但如果启动调试,我会系统地收到以下错误消息: 已设置安全调试选项,但它需要Visual Studio 在此调试配置中不可用的宿主进程 安全调试选项将被禁用。此选项可以在中重新启用 安全属性页。调试会话将继续进行,但不会出现错误 安全调试 然后,什么也没发生。什么都不会开始 请注意,这是一个包含多个启动项目(包括一个WPF项目)的解决方案 编辑:
通过禁用Project->Properties->security选项卡下的“Enable ClickOnce security settings”(启用ClickOnce安全设置)选项,它可以正常工作。MS已在VS2017中删除VS托管进程-请参阅 因此,将项目用户文件中的EnableSecurityDebugging设置更改为True只会导致在运行时再次出现错误对话框。单击对话框中的“确定”将用户文件设置更改为False
尽管微软似乎在发布非常频繁的VS更新(最新版本为15.3),但目前还没有解决办法。将无法使用安全调试选项 如果它对其他任何人都有帮助(我有相同的场景),那么它就是一个多启动解决方案,其中包括一个将使用ClickOnce部署的客户端。为了消除客户端在获得“安全设置”对话框后无法启动的问题,我将其移到“启动项目”对话框列表的更高位置。如果客户机项目位于列表中的服务器项目之上,则无错误,所有内容都将调试。如果客户机项目低于服务器项目,那么我会得到错误,并且客户机永远不会打开。这并不能完全解决问题,但对我来说是一个非常合适的解决方法 编辑:您可能需要关闭并重新打开Visual Studio才能使此解决方案生效。: 最有可能的是,您意外地将位翻转到调试 使用ClickOnce安全设置。你能得到项目的属性吗 对于您的应用程序,请转到“安全”选项卡,并确保取消选中 “启用ClickOnce安全设置”或选中“这是一个完整的 “信任应用程序”单选按钮
这里有一个变通方法,使我能够调试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" });
}
}
}
}
使用系统;
运用系统反思;
使用System.Runtime.Hosting;
使用系统安全;
使用System.Security.Permissions;
使用系统、安全、策略;
使用System.Windows.Forms;
使用Microsoft.Build.Tasks.Deployment.Utilities;
命名空间安全性调试测试
{
静态类程序
{
///
///应用程序的主要入口点。
///
[状态线程]
静态void Main(字符串[]参数)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
如果(args.Length>0&&args[0]=“startui”)
{
Application.Run(新Form1());
}
其他的
{
PermissionSet permissions=新的PermissionSet(PermissionState.Unrestricted);
字符串AppName=Assembly.GetEntryAssembly().GetName().Name;
字符串AppExe=$“{AppName}.exe”;
字符串DebugSecurityZoneURL=$“{AppExe}.manifest”;
字符串AppManifestPath=$“{AppName}.application”;
字符串appType=“win32”;
AssemblyIdentity ca=AssemblyIdentity.FromManifest(AppManifestPath);
字符串appIdentitySubString=$“版本={ca.Version},区域性={ca.Culture},PublicKeyToken={ca.PublicKeyToken},ProcessorArchitecture={ca.ProcessorArchitecture}”;
字符串assemblyIdentity=$”http://tempuri.org/{AppManifestPath}{AppManifestPath},{appIdentitySubString}/{AppExe},{appIdentitySubString},Type={appType}”;
System.ApplicationIdentity ApplicationIdentity=新系统.ApplicationIdentity(assemblyIdentity);
ApplicationTrust appTrust=新的ApplicationTrust();
appTrust.DefaultGrantSet=新的PolicyStatement(权限,PolicyStatementAttribute.Nothing);
appTrust.isApplicationOnTrustedToRun=true;
appTrust.ApplicationIdentity=ApplicationIdentity;
AppDomainSetup adSetup=新建AppDomainSetup
{
ApplicationBase=AppDomain.CurrentDomain.BaseDirectory,
ActivationArguments=新的ActivationArguments(
ActivationContext.CreatePartialActivationContext(
适用性,
新字符串[]{AppManifestPath,DebugSecurityZoneURL})
),
ApplicationTrust=appTrust
};
证据e=新证据();
e、 阿德霍斯特维