Mat*_*and 12 c# debugging vsix
我正在开发Visual Studio扩展,其中一个函数创建一个新的应用程序域并将程序集加载到该应用程序域中.然后它在app域中运行一些函数.我想做什么,并且不确定是否可能,是否有我的扩展程序将调试器附加到新应用程序域中运行的代码,因此当该代码失败时,我实际上可以看到发生了什么.现在我正在盲目地调试动力加载的组件是一种痛苦.
所以我有一个创建我的app域的类,如下所示:
domain = AppDomain.CreateDomain("Test_AppDomain",
AppDomain.CurrentDomain.Evidence,
AppDomain.CurrentDomain.SetupInformation);
Run Code Online (Sandbox Code Playgroud)
然后创建一个这样的对象:
myCollection = domain.CreateInstanceAndUnwrap(
typeof(MyCollection).Assembly.FullName,
typeof(MyCollection).FullName,
false,
BindingFlags.Default,
null,
new object[] { assemblyPath }, null, null);
Run Code Online (Sandbox Code Playgroud)
MyCollection
在它的构造函数中执行类似的操作:
_assembly = Assembly.LoadFrom(assemblyPath);
Run Code Online (Sandbox Code Playgroud)
所以现在已经加载了程序集,Test_AppDomain
因为该MyCollection
对象是在该域中创建的.这是我需要能够附加调试器的加载程序集.
在某些时候myCollection
创建一个对象的实例并挂钩一些事件:
currentObject = Activator.CreateInstance(objectType) as IObjectBase;
proxy.RunRequested += (o, e) => { currentObject?.Run(); };
Run Code Online (Sandbox Code Playgroud)
基本上我有处理程序RunRequested
和运行的地方currentObject?.Run()
,我想要附加一个调试器,虽然它可能不是一个问题(并且可能实际上工作得更好)如果先前附加了调试器.
有没有办法实现这一目标?当用户触发将导致在Run
调用的新AppDomain中创建的对象的功能的事件时,是否可以以编程方式附加调试器?如何附加调试器(而不是扩展本身)?
我试过这样的事情:
var processes = dte.Debugger.LocalProcesses.Cast<EnvDTE.Process>();
var currentProcess = System.Diagnostics.Process.GetCurrentProcess().Id;
var process = processes.FirstOrDefault(p => p.ProcessID == currentProcess);
process?.Attach();
Run Code Online (Sandbox Code Playgroud)
但似乎内部的id System.Diagnostics.Process.GetCurrentProcess().Id
不存在LocalProcesses
?
小智 0
解决这个问题的一种方法是生成另一个程序集,其中的函数将接受 MethodInfo 对象并简单地调用 System.Diagnostics.Debugger.Launch() 和给定的 MethodInfo,然后您所要做的就是解开该程序集的函数使用您想要启动实际域的任何方法信息来调用它,并且您的好处是它将启用调试器,然后调用您希望它启动的方法。