1

我编写了一个 COM 可见的 dll,它将从本机 Win32 程序中调用。出于调试目的,我在包含 dll 的解决方案中添加了一个简单的 WinForms 客户端。

现在,当我在 dll 中设置断点时,该断点被命中,但我无法单步执行代码:调试器总是跳转到 dll 中的下一个断点,或者调用后的客户端中的第一行代码dll。

如何让调试器单步执行 dll 代码?

我认为它可能是“仅启用我的代码”选项,但没有设置。

更新 jdv 建议在项目属性中设置“启用非托管代码调试”,但这并没有达到预期的效果。

谢谢,米尔。

4

2 回答 2

4

以下是我执行的步骤,这些步骤使我能够成功调试作为 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");
        }
    }
}

使用强密钥对程序集进行签名并注册为 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并运行应用程序。一旦断点被​​击中,打开模块窗口( Ctrl+D M) 并确保为 COM 程序集加载了符号:

替代文字

现在,如果您按下F11,您可以进入 COM 类进行调试。

备注:也可以直接打开包含Foo该类的.cs文件,直接在该处下断点。再一次重要的是为程序集加载符号,或者当你放置断点时,Visual Studio 会告诉你这个断点不会被命中。

于 2010-09-10T19:41:41.380 回答
1

有一个发布后的 VS2008 SP1 修复程序解决了一些调试问题。知识库文章在这里,修补程序下载在这里

于 2010-09-13T08:22:07.173 回答