Debug com可见dll托管代码

时间:2010-09-06 13:28:40

标签: c# visual-studio debugging dll comvisible

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

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

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

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

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

谢谢,Miel。

2 个答案:

答案 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程序集加载符号:

alt text

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

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

答案 1 :(得分:1)

发布了一个VS2008 SP1修补程序,解决了许多调试问题。知识库文章is here,修补程序下载is here