.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)托管

COM“进程外”服务器的 C++/CLI 等效项

ASP.NET - 未捕获的 SyntaxError:无法在模块外使用 import 语句

从 ATL exe 服务器 (COM) 调用 .NET GUI

在加载进程内服务器对象实例时防止进程外服务器关闭

不能在模块外使用 import 语句