2015-04-23 82 views
4

我试图编写一些使用DIA (Debug Interface Access) SDK来查询PDB文件的C#代码。我使用this问题中描述的批处理文件在DIA类型库周围创建包装程序集。现在我可以创建由SDK公开的不同COM类的实例。.NET COM回调

但是,出现了问题。该IDiaDataSource::loadDataForExe方法要求实现以下接口之一的回调对象:

  • IDiaLoadCallback
  • IDiaLoadCallback2
  • IDiaReadExeAtOffsetCallback
  • IDiaReadExeAtRVACallback

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

我是否缺少一些东西,或者是在C#中实现这些接口的唯一方法是首先手动使用各种COM属性声明它们?

+0

可能重复_ [如何使用C#中的MS DIA SDK?](http://stackoverflow.com/questions/697541/how-do-i-use-the-ms-dia-sdk-from -c)_ – MickyD

+0

@MickyDuncan,我不这么认为。我尝试了那里描述的方法,结果不完整(如我的问题所述)。 –

+0

在OleView中查看是否在此处定义了接口。另请参阅底部的TypeLibs。也许他们没有在你的系统上注册? – MickyD

回答

3

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

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

这很容易修复。首先将dia2.idl复制到另一个目录或文件名,以免损坏原件。然后编辑副本,只需将这四个接口剪切并粘贴到[library]部分。用记录的Midl.exe命令重建类型库。问题解决了。