.NET COM回调

时间:2015-04-23 11:36:14

标签: c# .net com com-interop

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

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

  • IDiaLoadCallback
  • IDiaLoadCallback2
  • IDiaReadExeAtOffsetCallback
  • IDiaReadExeAtRVACallback

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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