代码之家  ›  专栏  ›  技术社区  ›  Miel

调试COM可见的dll托管代码

  •  1
  • Miel  · 技术社区  · 15 年前

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

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

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

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

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

    谢谢,Miel。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

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

        2
  •  3
  •   Darin Dimitrov    15 年前

    以下是我执行的步骤,这些步骤允许我成功调试作为COM组件公开的.NET程序集:

    首先创建一个类库,其中包含一个将作为COM对象公开的类:

    命名空间测试 { 使用系统; 使用System.Runtime.InteropServices; 公共接口ifoo { 空格(); } [可见(真)] 公共类foo:ifoo { 公共空栏() { console.writeline(“bar”); } } } < /代码>

    Sign the assembly with a strong key and register as com object:。

    regasm.exe/codebase comtest.dll
    < /代码> 
    
    

    一旦注册了COM对象,您可以在新的Visual Studio实例中创建新的控制台应用程序来测试COM对象:

    类程序 { 静态void main() { var type=type.gettypefromprogid(“comtest.foo”); var instance=activator.createInstance(type); type.invokemember(“bar”,bindingFlags.invokeMethod,空,实例,新对象[0]); } } < /代码>

    invokememberline上放置断点并运行应用程序。点击断点后,打开模块窗口,并确保已为COM程序集加载符号:

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

    备注:您也可以直接打开.cs文件,其中包含foo->code>类,并直接在那里放置一个断点。再次强调,重要的是要为程序集加载符号,或者在放置断点时,Visual Studio将告诉您,此断点不会被命中。

    成功调试作为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类进行调试。

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