2011-03-31 2 views
1

Наш клиент имеет старые клиенты Win32, которые используют встроенную C++ COM-зарегистрированную .dll, которую мы предоставляем.Замените родной C++ COM .dll на .NET COM .dll

Мы хотим заменить родную .dll версией .NET. Итак, мы создали .NET dll и COM зарегистрировали его. У нас есть собственные тестовые клиенты C++, которые могут обрабатывать своп из старой .dll в новую, но ... кажется, нам нужно перекомпилировать их для работы.

Есть ли какая-то логическая причина, по которой нам нужно перекомпилировать тестовый клиент, или мы делаем что-то неправильно?

Мы не можем требовать от наших клиентов перекомпилировать своих клиентов.

+0

Возможно, потому что TLB-файл или GUID отличаются друг от друга, поэтому он не узнает новый интерфейс. Я предполагаю, что вы создаете DLL-оболочку COM для .NET, поскольку старые клиенты Win32 не понимают .NET, правильно? –

ответ

7

Возможно, вы забыли использовать атрибут [Guid] на интерфейсе и объявления класса. Они должны соответствовать IID и CLSID, которые использовались в IDL для старого проекта на C++. Или функции не в том же порядке больше. Или они не имеют того же DISPID, если клиентский код использует их на поздней основе.

Лучший способ избежать этого - добавить ссылку на библиотеку старого типа в вашем проекте .NET, чтобы вы могли использовать старые интерфейсы в своем коде. Вам все равно нужно получить [Guid] класса, который правильно реализует интерфейсы, чтобы иметь правильный CLSID.

Вы можете использовать инструмент OleView.exe, библиотеку View + Type для сравнения старой и новой библиотеки типов. Скопируйте/вставьте созданный IDL и разделите его. Вы получаете новую библиотеку типов из Regasm.exe/tlb. Любое несоответствие может (и, вероятно, будет) проблемой.

Смежные вопросы