.NET 进程外服务器的#import 问题
Posted
技术标签:
【中文标题】.NET 进程外服务器的#import 问题【英文标题】:Problems with #import of .NET out-of-proc server 【发布时间】:2010-09-05 23:27:39 【问题描述】:在 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
(或将其放在路径中),但我也无法编译。
有什么建议吗?
【问题讨论】:
【参考方案1】:在我的#import 中添加了 no_namespace 和 raw_interfaces_only:
#import "server.tlb" no_namespace named_guids
同时使用 TLBEXP.EXE 而不是 REGASM.EXE 似乎有助于解决这个问题。
【讨论】:
TLBEXP 没有帮助我,raw_interfaces_only 帮助了我。为什么代码示例包含 named_guids 而不是 raw_interfaces_only?【参考方案2】:另外,请确保您的 C# 类没有此属性:
[ClassInterface(ClassInterfaceType.AutoDual)]
【讨论】:
知道为什么会这样吗?【参考方案3】:通常,当 MSVC 将 COM 源编译为 TLB
时,会留下如下提示:
#import "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.tlb"
您应该将其添加到 stdafx.h
行之前
#import "your_own.tlb"
之后,_Type
、_ObjRef
等基本类型将添加到您的项目中以生成原型。
希望能解决你的问题。
但更大的问题是,当一切都完成后,在程序中调用 Ptr 时可能会出现运行时错误
有人可以帮忙吗?
【讨论】:
【参考方案4】:看来你需要使用
[ClassInterface(ClassInterfaceType.None)]
这里是another discussion关于类似问题。
【讨论】:
【参考方案5】:#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
以上是关于.NET 进程外服务器的#import 问题的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 进程外(out-of-process)托管
ASP.NET - 未捕获的 SyntaxError:无法在模块外使用 import 语句