C# Visual Studio 2010自动附加到进程

C# Visual Studio 2010自动附加到进程,c#,wcf,visual-studio-2010,C#,Wcf,Visual Studio 2010,我使用的是visual studio 2010,我的应用程序有一个多U层架构 MainUI、WCFService、BLL和DAL 我的MainUI与WCF通信,WCF进一步与BLL和DAL通信,每当我需要调试BLL和DAL时,我首先需要在Visual studio中将WCF作为一个进程附加(每次)。我怎样才能摆脱这场麻烦呢 如何设置VisualStudio,使其能够自动连接到服务,并且可以轻松调试应用程序 感谢您尝试在代码中使用System.Diagnostics.Debugger.Break(

我使用的是visual studio 2010,我的应用程序有一个多U层架构

MainUI、WCFService、BLL和DAL

我的MainUI与WCF通信,WCF进一步与BLL和DAL通信,每当我需要调试BLL和DAL时,我首先需要在Visual studio中将WCF作为一个进程附加(每次)。我怎样才能摆脱这场麻烦呢

如何设置VisualStudio,使其能够自动连接到服务,并且可以轻松调试应用程序


感谢您尝试在代码中使用System.Diagnostics.Debugger.Break()。如果未附加调试器,则运行该代码将要求附加调试器,您可以选择现有实例

  • 在wcf服务项目的属性页面中,选择Web选项卡
  • 为启动操作选择“启动外部程序”,然后选择MainUI.exe
  • 将工作目录设置为MainUI.exe所在的文件夹(可能是bin文件夹)
  • 设置断点并按f5开始调试

  • 如果我理解正确,宏可能是答案:

    在Vs中:

  • 工具->宏->临时录制宏(Ctrl+shift+r)
  • 按常规将VS附加到进程(ctrl+alt+p)
  • 停止录制宏(ctrl+shift+r)
  • 转到查看->其他窗口->宏资源管理器(CTRL+F8)
  • 找到临时宏(在MyMacros->RecordingModule中的某个地方)并重命名它
  • 现在,转到工具->选项->键盘并找到您的宏(在“显示包含您的宏的写入名称的命令”中)
  • 在“按快捷键”中,将其绑定到某个快捷键(我的宏位于CTRL+SHIFT+K;)
  • 按OK键
  • 高兴

  • 您是否在希望调试器附加到的服务中尝试了
    System.Diagnostics.Debugger.Launch()

    为多项目启动配置解决方案。我为类似的应用程序执行此操作。VS会自动启动WCF和客户端,并且我可以在其中设置断点

    启动顺序是选择项目的顺序


    <鼠标右键单击您的解决方案并选择“选择启动项目”。然后选择多个启动项目并选择项目。

    < P>您是否尝试使用VisualStudio附带的WCFSvcHost.EXE启动BLL和DAL服务?有一个帮助文件。帮助文件说明它最好,“Windows通信基金会”。(WCF)服务主机(wcfSvcHost.exe)允许您启动Visual Studio调试器(F5)以自动承载和测试已实现的服务。然后,您可以使用WCF测试客户端(wcfTestClient.exe)或您自己的客户端测试该服务,以查找和修复任何潜在错误。"默认安装为C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE。您可以将其配置为将您的MainUI应用程序用作客户端。同一目录中的帮助文件WcfSvcHost.chm有一个部分,用于在使用ECF服务主机的方案下使用自定义客户端。如果您愿意,请单击此处,以链接MS网站上的帮助:。

    示例如何启动流程并使用EnvDTE将其附加到VisualStudio2010(版本相关)

    //c:\ProgramFiles(x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblys\EnvDTE.dll
    使用Process=EnvDTE.Process;
    System.Diagnostics.Process p=新的System.Diagnostics.Process();
    p、 StartInfo.FileName=System.AppDomain.CurrentDomain.BaseDirectory+@“\YourProcess.exe”;
    //开始这个过程
    p、 Start();
    //等待进程初始化
    系统线程线程睡眠(1000);
    bool-attached=false;
    //没有找到更好的解决方案(因为它不是超级可靠的)
    对于(int i=0;i<5;i++)
    {
    如有(附件)
    {
    打破
    }
    尝试
    {
    EnvDTE.DTE dte2=(EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject(“VisualStudio.DTE.10.0”);
    EnvDTE.Debugger调试器=dte2.Debugger;
    foreach(debugger.localprocesss中的进程程序)
    {
    if(program.Name.Contains(“YouProcess.exe”))
    {
    program.Attach();
    附加=正确;
    }
    }
    }
    捕获(例外情况除外)
    {
    //句柄执行选项。。。
    }
    }
    
    如果这是针对自托管WCF windows服务的,则需要将WCF服务主机配置为在控制台中运行或作为windows服务运行。打开“在控制台中运行”后,可以从visual studio开始调试

    创建名为“RunInCole”的应用程序设置。在服务主机启动方法中,具有以下代码:

    public class MyWindowsService : ServiceBase
    {
        public static void Main(string[] args)
        {
            // if configuration says to run in the console, run the service in a console app. otherwise, use windows
            // service to host application
            if (ConfigurationManager.AppSettings["RunInConsole"] == "true")
            {
                using (ServiceHost host = new ServiceHost(typeof(MyService)))
                {
                    host.Open();
                    Console.WriteLine("Press <Enter> to terminate the Host application.");
                    Console.ReadLine();
                }
            }
            else
                ServiceBase.Run(new MyWindowsService ());
        }
    
    }
    
    公共类MyWindowsService:ServiceBase
    {
    公共静态void Main(字符串[]args)
    {
    //如果配置要求在控制台中运行,请在控制台应用程序中运行该服务。否则,请使用windows
    //服务到主机应用程序
    如果(ConfigurationManager.AppSettings[“RunIncole”]=“true”)
    {
    使用(ServiceHost主机=新ServiceHost(typeof(MyService)))
    {
    host.Open();
    WriteLine(“按下以终止主机应用程序”);
    Console.ReadLine();
    }
    }
    其他的
    Run(新的MyWindowsService());
    }
    }
    

    在您部署到的所有环境中,您总是将此配置设置设置为false,否则服务将无法启动,但在本地调试时,您会将其设置为true。

    这里有一篇文章解释了如何执行此操作……您可以自定义此宏


    就我个人而言,我更喜欢按照这里的建议使用
    ,因为它不需要引用DTE(这是特定于IDE的,必须显式引用到要使用的项目中)

    但我仍然必须附加它,它不会自动附加您是否考虑过录制宏并将其绑定到快捷方式?这仍然是一个手动过程,每次我执行应用程序并想要调试它时都要使用快捷方式,这是一个复杂的过程
    public class MyWindowsService : ServiceBase
    {
        public static void Main(string[] args)
        {
            // if configuration says to run in the console, run the service in a console app. otherwise, use windows
            // service to host application
            if (ConfigurationManager.AppSettings["RunInConsole"] == "true")
            {
                using (ServiceHost host = new ServiceHost(typeof(MyService)))
                {
                    host.Open();
                    Console.WriteLine("Press <Enter> to terminate the Host application.");
                    Console.ReadLine();
                }
            }
            else
                ServiceBase.Run(new MyWindowsService ());
        }
    
    }