【问题标题】:VS 2017 : The security debugging option is set but it requires the Visual Studio hosting process which is unavailableVS 2017:设置了安全调试选项,但它需要 Visual Studio 托管进程,该进程不可用
【发布时间】:2017-12-02 22:54:11
【问题描述】:

我的解决方案(包含十几个项目)在 Visual Studio 2013 中完美运行。

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

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

安全调试选项已设置,但它需要 Visual Studio 在此调试配置中不可用的托管进程。 安全调试选项将被禁用。此选项可能会在 安全属性页。调试会话将继续没有 安全调试

然后,什么也没有发生。什么都没有开始。

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

编辑: 通过禁用项目 -> 属性 -> 安全选项卡下的“启用 ClickOnce 安全设置”选项,它可以工作。

【问题讨论】:

  • 是否勾选了Project->Properties->Debug下的“Enable the Visual Studio hosting process”复选框?
  • Visual Studio 2017 中不存在此复选框。
  • 尝试从 bin 和 obj 目录中删除所有文件,然后重新构建。
  • 但是通过禁用项目 -> 属性 -> 安全选项卡下的“启用 ClickOnce 安全设置”选项,它可以工作。
  • StevenPF,我也遇到过这个问题。但我想知道您是否真的想在您的 WPF 应用程序中清除该复选框?

标签: c# .net wpf visual-studio visual-studio-2017


【解决方案1】:

This solved my issue:

很可能,您不小心弄错了调试位置 使用 ClickOnce 安全设置。你能得到项目属性吗 对于您的应用,请转到“安全”选项卡,并确保取消选中 “启用 ClickOnce 安全设置”或选中“这是一个完整的 信任应用程序”单选按钮。

【讨论】:

    【解决方案2】:

    如果它可以帮助其他任何人 - 我有相同的场景 - 一个多启动解决方案,其中包括一个将与 ClickOnce 一起部署的客户端。为了消除客户端在获得安全设置对话框后无法启动的问题,我将其在启动项目对话框的列表中移到了更高的位置。如果客户端项目在列表中的服务器项目之上,则没有错误,一切都在调试。如果客户端项目低于服务器项目,那么我会收到错误并且客户端永远不会打开。这并不能完全解决问题,但对我来说是一个完全足够的解决方法。

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

    【讨论】:

    • 我有一个 ClickOnce WinForms 应用程序,它依赖于 2 个服务,也在解决方案中。在启动时将 WinForms 移到其他两个之上就可以了!谢谢。
    • 天哪,我不敢相信这有效!这没有任何意义,但仍然可以完美运行。
    • 运行成功后我把最后的客户端移回来重新启动,现在也可以了。关闭和重新打开 VS 可能会奏效:)
    • 我必须切换加载顺序才能使其工作。重新启动VS绝对没有做任何事情。切换加载顺序允许 VS 正确修改 WPF 文件,因为该服务尚未调试。在允许它这样做之后,您可以毫无问题地切换加载顺序。您只需确保它能够在调试服务之前修改项目文件。
    【解决方案3】:

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

    转到项目 > 属性... > 构建

    取消选中复选框首选 32 位

    【讨论】:

    • 我还注意到optimize code 在调试模式下是正确的。对我来说,关闭optimize code 就可以了!感谢您的帖子。
    • 伙计,你节省了我和其他很多人的工作时间。谢谢。
    【解决方案4】:

    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 应用程序。将无法使用安全调试选项。

    【讨论】:

      【解决方案5】:

      这可能是某些配置文件中的故障。 “启用 ClickOnce 安全设置”已在项目设置中未标记,但每次启动应用程序时仍会出现此对话框。我做了以下事情来摆脱这个对话:

      1. 打开项目->安全设置页面
      2. 标记“启用 ClickOnce 安全设置”
      3. 取消标记“启用 ClickOnce 安全设置”
      4. 保存属性并重新启动应用程序

      Properties

      【讨论】:

        【解决方案6】:

        这是一个解决方法,使我能够调试我的 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 团队在此解决方法上提供的帮助。

        【讨论】:

          【解决方案7】:

          我还有另一个原因可能会出现此消息。就我而言,在测试从 Git 克隆我的解决方案时,我注意到 Visual Studio 决定将活动解决方案平台设置为“任何 CPU”,而我的启动项目明确针对“x86”。这导致我在运行构建解决方案命令时无法构建启动项目。

          在配置管理器中为该项目选中构建框消除了错误消息。

          如果有人问起,我不记得究竟为什么那个项目明确针对 x86。

          【讨论】:

            【解决方案8】:

            我也遇到了同样的问题。首选 32 位已禁用。 我查看了输出路径,它是 bin\Release。
            我创建了一个 bin\debug 路径并将输出路径设置为此。 已解决。

            【讨论】:

              【解决方案9】:

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

              在我有“该应用程序只能在线获得”之前

              【讨论】:

                【解决方案10】:

                我的问题似乎与解决方案所在的文件夹有关。我的 DEV 分支解决方案正常工作,但 CERT 分支(不同的本地文件夹)在检查 ClickOnce 安全设置时给出了安全调试消息。

                我的解决方案:以管理员身份启动 VS2019。调试时问题消失了。现在我可以在没有管理员的情况下启动并且调试仍然很好。

                【讨论】:

                  【解决方案11】:

                  没有解释原因的快速解决方案:在“调试”配置中运行我的应用程序会停止错误并允许我的应用程序运行。

                  【讨论】:

                    猜你喜欢
                    • 2017-08-13
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-07-17
                    • 2015-04-14
                    • 2016-05-20
                    • 2020-05-22
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多