.NET COM 回调函数

4
我正在尝试编写一些C#代码,使用DIA(Debug Interface Access) SDK查询PDB文件。我使用this问题中描述的批处理文件创建了一个包装DIA类型库的程序集。现在,我能够创建SDK公开的不同COM类的实例。
然而,出现了一个问题。IDiaDataSource::loadDataForExe方法需要一个回调对象,该对象实现以下接口之一:
  • IDiaLoadCallback
  • IDiaLoadCallback2
  • IDiaReadExeAtOffsetCallback
  • IDiaReadExeAtRVACallback
所有这些接口都在IDL中定义,但在生成的.NET程序集中不可用。
我是否遗漏了什么,或者在C#中实现这些接口的唯一方法是首先手动使用各种COM属性声明它们?

可能是重复的问题:_如何从C#中使用MS DIA SDK?_ - user585968
@MickyDuncan,我不这么认为。我尝试了那里描述的方法,结果是不完整的(正如我在问题中所描述的)。 - Michael Bikovitsky
在 OleView 中查看接口是否已定义。还可以参考底部的 TypeLibs。也许它们没有在您的系统上注册? - user585968
满足要求了吗?头文件:Dia2.h 库文件:diaguids.lib 动态链接库文件:msdia80.dll - relascope
就像P-Invoke一样,我发现一旦你跨越了某个阈值,用C++/CLI包装器编写比在.NET中重新定义所有内容更好(特别是那些不公开类型库的COM系统)。如果你对两者都有经验,你会发现C++端的COM要容易得多,因为它有20多年的工具和类库历史。 - user585968
刚刚检查了一下,类型库 不包含 接口。 - Michael Bikovitsky
1个回答

3
是的,这是一个问题,生成的类型库不包含这些接口。你可以通过运行OleView.exe,选择查看+ Typelib命令来查看类型库的内容,反编译回IDL语法。注意IDiaLoadCallback等接口缺失的情况。
这是IDL中的作者问题,对于使用DIA的C++项目没有问题,但如果依赖于类型库进行定义,则有问题。问题在于Midl.exe将优化类型库,并仅包括存在或被引用于[library]部分中的声明。由于这些是回调接口,因此没有[coclass]声明使用这些接口。所以它们被省略在类型库中。
修复非常简单。首先将dia2.idl复制到另一个目录或文件名中,以免损坏原始文件。然后编辑副本,只需将这四个接口剪切并粘贴到[library]部分中。使用Midl.exe文档中的命令重新构建类型库即可解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接