首页 文章

VS 2017:已设置安全性调试选项,但它需要Visual Studio托管过程,该过程不可用

提问于
浏览
34

我的解决方案(包含十几个项目)在Visual Studio 2013中运行良好 .

在Visual Studio 2017中,我可以打开解决方案并进行编译 .

但是,如果我开始调试,我会系统地收到此错误消息:

已设置安全性调试选项,但它需要Visual Studio托管过程,该过程在此调试配置中不可用 . 将禁用安全性调试选项 . 可以在“安全性”属性页中重新启用此选项 . 调试会话将继续,无需安全调试

enter image description here

然后,没有任何事情发生 . 什么都没有开始 .

有关信息,这是一个包含多个启动项目(包括WPF项目)的解决方案 .

Edit : 通过禁用项目 - >属性 - >安全选项卡下的选项"Enable ClickOnce security settings",它可以正常工作 .

7 回答

  • 0

    万一它可以帮助其他人 - 我有相同的场景 - 一个多启动解决方案,其中包括将与ClickOnce一起部署的客户端 . 为了消除客户端在获取“安全设置”对话框后未启动的问题,我将其在启动项目对话框的列表中向上移动 . 如果客户端项目位于列表中的服务器项目之上,则没有错误,所有内容都会进行调试 . 如果客户端项目在服务器项目下面,那么我得到错误,客户端永远不会打开 . 这并不完全解决问题,但对我来说是一个非常合适的解决方法 .

    编辑:您可能需要关闭并重新打开Visual Studio才能使此变通方法生效 .

  • 10

    这解决了我的问题:https://social.msdn.microsoft.com/Forums/vstudio/en-US/3905f6ac-737b-420f-b312-3dd8e3676c35/getting-an-unexplained-securityexception?forum=wpf

    最有可能的是,您不小心将这个位翻转到使用ClickOnce安全设置进行调试 . 您是否可以获取应用程序的项目属性,转到“安全”选项卡,并确保取消选中“启用ClickOnce安全设置”或选中“这是一个完全信任的应用程序”单选按钮 .

  • 15

    MS已经删除了VS2017中的VS主机进程 - 请参阅

    https://vslive.com/Blogs/News-and-Tips/2017/02/Debugging-Visual-Studio-2017-aims-to-speed-up-your-least-favorite-job.aspx

    因为这会将项目用户文件中的EnableSecurityDebugging设置更改为True,只会导致在运行时再次出现“错误”对话框 . 在对话框中单击“确定”会将用户文件设置更改回False .

    AFAIK没有解决方法,虽然MS似乎发布非常频繁的VS更新(最新版本为15.3)同时ClickOnce应用程序 . 将无法使用安全性调试选项 .

  • 3

    这可能是某些配置文件中的一个小故障 . “启用ClickOnce安全设置”已在项目设置中取消标记,但每次启动应用程序时仍会显示此对话框 . 我做了以下工作来摆脱这种对话:

    • 打开项目 - >安全设置页面

    • 马克"Enable ClickOnce security settings"

    • Unmark "Enable ClickOnce security settings"

    • 保存属性并再次启动应用程序

    Properties

  • 1

    我花了好几个小时试图找出问题,这解决了它 .

    转到 Projct > Properties ...> Build

    取消选中复选框 Prefer 32-bit

    enter image description here

  • 2

    这是一种解决方法,使我能够调试我的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主机进程不可用的警告消息,但此后项目用户文件中的EnableSecurityDebugging设置将设置为False,代码应正常运行 .

    感谢Microsoft的ClickOnce团队对此解决方案的帮助 .

  • 2

    对我来说,解决方案是在项目属性的“发布”选项卡中切换到“应用程序也可脱机使用”

    之前我有“该应用程序仅在线提供”

相关问题