4

在 C++ 程序中,我正在尝试 #import TLB of .NET out-of-proc server。

我收到如下错误:

z:\server.tlh(111) : 错误 C2146: 语法错误: 缺少 ';' 在标识符“GetType”之前

z:\server.tlh(111) : 错误 C2501: '_TypePtr' : 缺少存储类或类型说明符

z:\server.tli(74):错误 C2143:语法错误:缺少“;” 在'标签::id'之前

z:\server.tli(74) : error 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() 似乎会导致问题。

一些谷歌研究表明我可以#import mscorlib.tlb(或将其放入路径中),但我也无法编译。

有小费吗?

4

5 回答 5

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

是我的解决方案。

于 2010-04-28T17:17:27.517 回答
1

在我的#import 中添加了 no_namespace 和 raw_interfaces_only:

#import "server.tlb" no_namespace named_guids

也使用 TLBEXP.EXE 而不是 REGASM.EXE 似乎有助于解决这个问题。

于 2008-08-15T21:06:51.660 回答
1

通常,当 MSVC 将 COM 源编译为 aTLB时,会留下如下提示:

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

您应该将其添加到stdafx.h该行之前

#import "your_own.tlb"

之后,基本类型(如_Type, )_ObjRef将添加到您的项目中以生成原型。

我希望这能解决你的问题。

但更大的问题是,一切都完成后,在程序中调用 Ptr 时可能会出现运行时错误

有人可以帮忙吗?

于 2009-04-17T03:41:16.187 回答
1

看来你需要使用

[ClassInterface(ClassInterfaceType.None)]

这是关于类似问题的另一个讨论。

于 2010-01-15T13:36:14.040 回答
0

此外,请确保您的 C# 类没有此属性:

[ClassInterface(ClassInterfaceType.AutoDual)] <-- 似乎在 C++ 中使用 _TypePtr 导致错误

于 2008-08-20T17:08:27.310 回答