我正在使用Visual Studio 2010,我的应用程序采用多层体系结构。
包括MainUI(用户界面),WCFService(WCF服务),BLL(业务逻辑层)和DAL(数据访问层)。
我的MainUI与WCF通信,WCF进一步与BLL和DAL通信。每当我需要调试BLL和DAL时,我都需要将WCF作为进程附加到Visual Studio中(每次都要这样做)。有什么方法可以使我免于这种麻烦呢?
如何设置Visual Studio以自动附加到服务,使我能够轻松地调试应用程序。
谢谢。
我正在使用Visual Studio 2010,我的应用程序采用多层体系结构。
包括MainUI(用户界面),WCFService(WCF服务),BLL(业务逻辑层)和DAL(数据访问层)。
我的MainUI与WCF通信,WCF进一步与BLL和DAL通信。每当我需要调试BLL和DAL时,我都需要将WCF作为进程附加到Visual Studio中(每次都要这样做)。有什么方法可以使我免于这种麻烦呢?
如何设置Visual Studio以自动附加到服务,使我能够轻松地调试应用程序。
谢谢。
配置您的解决方案以启动多个项目。我对一个类似的应用程序进行了这样的操作。VS会自动启动WCF和客户端,我可以在任何一个中设置断点。
启动顺序是您选择项目的顺序。
右键单击您的解决方案,选择“选择启动项目”。然后选择多个启动项目并选择项目。
示例如何启动一个进程并将其附加到Visual Studio 2010与EnvDTE(版本相关)。
//c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\EnvDTE.dll
using Process = EnvDTE.Process;
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = System.AppDomain.CurrentDomain.BaseDirectory + @"\YourProcess.exe";
//Start the process
p.Start();
//Wait for process init
System.Threading.Thread.Sleep(1000);
bool attached = false;
//did not find a better solution for this(since it's not super reliable)
for (int i = 0; i < 5; i++)
{
if (attached)
{
break;
}
try
{
EnvDTE.DTE dte2 = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
EnvDTE.Debugger debugger = dte2.Debugger;
foreach (Process program in debugger.LocalProcesses)
{
if (program.Name.Contains("YouProcess.exe"))
{
program.Attach();
attached = true;
}
}
}
catch (Exception ex)
{
//handle execption...
}
}
你是否尝试在你想要调试器附加的服务中使用System.Diagnostics.Debugger.Launch()
?
http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx
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 ());
}
}
在您部署到的所有环境中,您都应该将此配置设置为false,否则服务将无法启动;但是在本地调试时,您应该将其设置为true。
这里有一篇详细的文章,解释了如何做到这一点...您可以自定义此宏。
如果我理解正确,宏可能是答案:
在Vs中:
Environment.UserInteractive
)。 - wal