我已经编写了一个 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 程序集加载符号:
现在,如果您按 F11,您可以进入 COM 类进行调试。
备注:您也可以直接打开包含Foo
类的.cs文件,直接在该处打断点。再次重要的是为程序集加载符号,或者当您放置断点时,Visual Studio 会告诉您不会命中此断点。
关于c# - 调试 com 可见 dll 托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651824/