在 C++ 程序中,我尝试 #import .NET 进程外服务器的 TLB。

我收到如下错误:

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() 似乎引起了问题。

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

有小费吗?

有帮助吗?

解决方案 3

将 no_namespace 和 raw_interfaces_only 添加到我的 #import 中:

#import "server.tlb" no_namespace named_guids

另外使用 TLBEXP.EXE 而不是 REGASM.EXE 似乎可以解决此问题。

其他提示

#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb" was the solution for me.

更重要的是,当VS符合COM源为TLB时,将会有这样的提示:// #import“ c: windows microsoft.net framework v2.0.50727 mscorlib.tlb” shoud shoud shoud thit shoud添加到#inport youown.tlb之前,basice属性,例如_ type,_objref,_objref,_objref将在您中添加您原型类型的项目

我想,它会解决你的问题。

但更大的问题是:完成所有操作后,当您在程序中调用 Ptr 时,会出现一些运行时错误

任何人都可以帮忙吗?

看来你需要使用

[ClassInterface(ClassInterfaceType.None)]

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top