Проблемы с #import внепроцессного сервера .NET

В программе на C++ я пытаюсь импортировать TLB внепроцессного сервера .NET.

Я получаю такие ошибки, как:

z: \ server.tlh (111): ошибка C2146: синтаксическая ошибка: отсутствует ';' перед идентификатором GetType

z: \ server.tlh (111): ошибка C2501: '_TypePtr': отсутствуют спецификаторы класса хранения или типа

z: \ server.tli (74): ошибка C2143: синтаксическая ошибка: отсутствует ';' перед 'tag :: id'

z: \ server.tli (74): ошибка C2433: '_TypePtr': 'inline' не разрешен в объявлениях данных

z: \ server.tli (74): ошибка C2501: '_TypePtr': отсутствуют спецификаторы класса или типа хранилища

z: \ server.tli (74): фатальная ошибка C1004: обнаружен неожиданный конец файла

TLH выглядит так:

_bstr_t GetToString();
VARIANT_BOOL Equals (const _variant_t & obj);
long GetHashCode();
_TypePtr GetType();
long Open();

Меня не очень интересуют методы базового объекта .NET, такие как GetType (), Equals () и т. Д. Но GetType (), похоже, вызывает проблемы.

Некоторые исследования Google показывают, что я мог #import mscorlib.tlb (или поместил его в путь), но я также не могу заставить это скомпилировать.

Какие-нибудь советы?

Ответов (5)

Решение

В мой #import добавлены no_namespace и raw_interfaces_only:

#import "server.tlb" no_namespace named_guids

Также использование TLBEXP.EXE вместо REGASM.EXE, похоже, помогает решить эту проблему.

Также убедитесь, что ваш класс C# не имеет этого атрибута:

[ClassInterface (ClassInterfaceType.AutoDual)] <- Кажется, вызывает ошибки в C++ с _TypePtr

Похоже, нужно использовать

[ClassInterface(ClassInterfaceType.None)]

Вот еще одно обсуждение подобной проблемы.

Часто, когда MSVC компилирует исходный код COM в a TLB, остаются подсказки, например:

#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"

Вы должны добавить это stdafx.h перед строкой

#import "your_own.tlb"

После этого в ваш проект будут добавлены базовые типы, такие как _Type, _ObjRef для сгенерированных прототипов.

Надеюсь, это решит вашу проблему.

но более серьезная проблема заключается в том, что после того, как все будет сделано, могут возникнуть ошибки времени выполнения, когда вы вызовете Ptr в своей программе.

кто-нибудь может помочь?

#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"

Был для меня решением.