c# - .NET COM 回调

标签 c# .net com com-interop

我正在尝试编写一些使用 DIA (Debug Interface Access) 的 C# 代码用于查询 PDB 文件的 SDK。我使用了 this 中描述的批处理文件围绕 DIA 类型库创建包装程序集的问题。现在我能够创建 SDK 公开的不同 COM 类的实例。

然而,问题出现了。 IDiaDataSource::loadDataForExe方法需要一个实现以下接口(interface)之一的回调对象:

  • IDiaLoadCallback
  • IDiaLoadCallback2
  • IDiaReadExeAtOffsetCallback
  • IDiaReadExeAtRVACallback

所有这些接口(interface)都在 IDL 中定义,但是它们在生成的 .NET 程序集中不可用。

我是否遗漏了什么,或者在 C# 中实现这些接口(interface)的唯一方法是首先手动使用各种 COM 属性声明它们?

最佳答案

是的,这是一个问题,生成的类型库不包含这些接口(interface)。通过运行 OleView.exe,View + Typelib 命令可以看到一些东西,它显示了类型库的内容,反编译回 IDL 语法。请注意 IDiaLoadCallback 等人是如何丢失的。

这是 IDL 中的创作问题,它不会在使用 DIA 的 C++ 项目中出现,但如果您依赖类型库进行定义,则会出现这种情况。问题是 Midl.exe 将优化类型库,并且只包含 [library] 部分中存在或引用的声明。由于这些是回调接口(interface),因此 [coclass] 声明都没有使用这些接口(interface)。因此类型库中省略了它们。

修复起来非常简单。首先将 dia2.idl 复制到另一个目录或文件名,以免损坏原始文件。然后编辑副本,只需将这四个界面剪切并粘贴到[库]部分即可。使用记录的 Midl.exe 命令重建类型库。问题解决了。

关于c# - .NET COM 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29822260/

相关文章:

c# - Quartz.NET scheduler.Interrupt(jobKey) 正在中断所有事件作业

c# - Apache Ignite.NET 和 AppDomain.CurrentDomain.ProcessExit

C# COM 跨线程

.net - 如何允许在事件处理程序连接到 COM 对象的对象上进行垃圾回收

c# - WebAPI - 如何从 token 中获取 UserID

c# - 垃圾收集器不清理哪些对象?

c# - MobileAppTracking 不起作用

c# - 为什么我的 c# Windows 服务在没有任何消息写入应用程序事件日志的情况下停止运行?

c++ - 您应该如何阅读以下文档?

C# - 文件上传到服务器后损坏