c# - 调试 com 可见 dll 托管代码

标签 c# visual-studio debugging dll comvisible

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

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

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

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

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

谢谢,米尔。

最佳答案

以下是我执行的步骤,这些步骤使我能够成功调试作为 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 会告诉您不会命中此断点。

关于c# - 调试 com 可见 dll 托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651824/

相关文章:

c# - 是否可以使用 Xamarin 工具开发 CarPlay 应用程序

css - 在 Visual Studio 中调试时如何强制 Chrome 浏览器重新加载 .css 文件?

python - pandas to_numeric/to_* 如果输入是数据帧切片则引发缓冲区错误

c# - C#中查找关键字最快的算法

c# - 如何将 Unity 支持添加到 NuGet 包?

c# - 修改已编译的.Net Exe

c# - 如何在 C# 中检测套接字断开连接

c# - 从 Visual Studio 加载项访问可用类型列表?

c++ - 使用 Visual Studio 2008 C++ 加速移动调试的提示

c++ - GDB 在从特定函数调用时抛出异常时中断