2015-04-23 3 views
4

Я пытаюсь написать код C#, который использует SDK DIA (Debug Interface Access) для запроса файла PDB. Я использовал командный файл, описанный в вопросе this, для создания сборки обертки вокруг библиотеки типов DIA. Теперь мне удалось создать экземпляры различных классов COM, открытых SDK..NET COM Callback

Однако возникла проблема. Метод IDiaDataSource::loadDataForExe требует объект обратного вызова, который реализует один из следующих интерфейсов:

  • IDiaLoadCallback
  • IDiaLoadCallback2
  • IDiaReadExeAtOffsetCallback
  • IDiaReadExeAtRVACallback

Все эти интерфейсы определены в IDL, однако они не доступны в сборке .NET.

Я что-то упустил или единственный способ реализовать эти интерфейсы в C# - это сначала вручную объявить их с использованием различных атрибутов COM?

+0

Возможный дубликат _ [Как использовать MS DIA SDK с C#?] (Http://stackoverflow.com/questions/697541/how-do-i-use-the-ms-dia-sdk-from -c) _ – MickyD

+0

@ Микки Дункан, я так не думаю. Я попробовал описанный там метод, и результаты были неполными (как описано в моем вопросе). –

+0

Посмотрите в OleView, чтобы узнать, существует ли там интерфейс. Также обратитесь к TypeLibs внизу. Возможно, они не зарегистрированы в вашей системе? – MickyD

ответ

3

Да, это проблема, библиотека сгенерированного типа не содержит этих интерфейсов. Что-то, что вы можете увидеть, запустив команду OleView.exe, View + Typelib, отображает содержимое библиотеки типов, декомпилированное обратно в синтаксис IDL. Обратите внимание, что отсутствуют IDiaLoadCallback и др.

Это проблема разработки в IDL, она не байт в проектах на C++, использующих DIA, но делает это, если вы зависите от библиотеки типов для определений. Проблема в том, что Midl.exe оптимизирует библиотеку типов и включает только объявления, которые присутствуют или упоминаются в разделе [library]. И поскольку это интерфейсы обратного вызова, ни одно из объявлений [coclass] не использует эти интерфейсы. Поэтому они не указаны в библиотеке типов.

Это довольно просто исправить. Сначала скопируйте dia2.idl в другой каталог или имя файла, чтобы не повредить оригинал. А затем отредактируйте копию, просто вырезайте и вставьте эти четыре интерфейса в раздел [library]. Перестройте библиотеку типов с документированной командой Midl.exe. Задача решена.