2015-04-23 44 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命令重建類型庫。問題解決了。