C# VS 2017:已设置安全调试选项,但它需要Visual Studio宿主进程,该进程不可用

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项目)的解决方案 编辑:

我的解决方案(包含十几个项目)在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、 阿德霍斯特维