В программе на C++ я пытаюсь импортировать TLB внепроцессного сервера .NET.
Я получаю такие ошибки, как:
z:\server.tlh(111) : error C2146: syntax error : missing ';' before identifier 'GetType'
z:\server.tlh(111) : error C2501: '_TypePtr' : missing storage-class or type specifiers
z:\server.tli(74) : error C2143: syntax error : missing ';' before 'tag::id'
z:\server.tli(74) : error C2433: '_TypePtr' : 'inline' not permitted on data declarations
z:\server.tli(74) : error C2501: '_TypePtr' : missing storage-class or type specifiers
z:\server.tli(74) : fatal error C1004: unexpected end of file found
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 (или поместить его в путь), но я также не могу заставить его скомпилировать.
Какие-нибудь советы?





В мой #import добавлены no_namespace и raw_interfaces_only:
#import "server.tlb" no_namespace named_guids
Также использование TLBEXP.EXE вместо REGASM.EXE, похоже, помогает решить эту проблему.
Также убедитесь, что ваш класс C# не имеет этого атрибута:
[ClassInterface (ClassInterfaceType.AutoDual)]
Есть идеи, почему это происходит?
Часто, когда MSVC компилирует исходный код COM в TLB, остаются подсказки, например:
#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"
Вы должны добавить это к stdafx.h перед строкой
#import "your_own.tlb"
После этого в ваш проект будут добавлены базовые типы, такие как _Type, _ObjRef, для сгенерированных прототипов.
Надеюсь, это решит вашу проблему.
но более серьезная проблема заключается в том, что после того, как все будет сделано, могут возникнуть ошибки времени выполнения, когда вы вызовете Ptr в своей программе.
кто-нибудь может помочь?
Похоже, нужно использовать
[ClassInterface(ClassInterfaceType.None)]
Вот другое обсуждение о подобной проблеме.
#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"
Был для меня решением.
Недавно пришлось использовать этот #import "C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\mscorlib.tlb" rename("or", "or2") rename("ReportEvent", "ReportEvent2") no_namespace
TLBEXP мне не помог, raw_interfaces_only помог. Почему пример кода содержит named_guids вместо raw_interfaces_only?