我编写了一个COM可见的dll,它将从本机Win32程序中调用。出于调试目的,我在包含dll的解决方案中添加了一个简单的WinForms客户端。
现在当我在dll中设置一个断点时,该断点被击中,但是我无法单步执行代码:调试器总是跳转到dll中的下一个断点,或者是客户端中的第一行代码对dll的调用。
如何让调试器逐步执行dll代码?
我认为它可能是“启用我的代码”选项,但是没有设置。
更新 jdv建议在项目属性中设置“启用非托管代码调试”,但这没有达到预期的效果。
谢谢,Miel。
答案 0 :(得分:3)
以下是我执行的步骤,这使我能够成功调试作为COM组件公开的.NET程序集:
首先创建一个包含将作为COM对象公开的类的类库:
namespace COMTest
{
using System;
using System.Runtime.InteropServices;
public interface IFoo
{
void Bar();
}
[ComVisible(true)]
public class Foo : IFoo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}
带有强密钥的Sign the assembly并注册为COM对象:
regasm.exe /codebase COMTest.dll
注册COM对象后,您可以在新的Visual Studio实例中创建一个新的控制台应用程序来测试COM对象:
class Program
{
static void Main()
{
var type = Type.GetTypeFromProgID("COMTest.Foo");
var instance = Activator.CreateInstance(type);
type.InvokeMember("Bar", BindingFlags.InvokeMethod, null, instance, new object[0]);
}
}
在InvokeMember
行放置一个断点并运行该应用程序。点击断点后,打开Modules Window( Ctrl + D M )并确保为COM程序集加载符号:
现在,如果你按 F11 ,你可以进入COM类进行调试。
备注:您也可以直接打开包含Foo
类的.cs文件,并直接在那里放置一个断点。重要的是重要的是为程序集加载符号,或者当你放置断点时,Visual Studio会告诉你这个断点不会被命中。
答案 1 :(得分:1)