【发布时间】:2011-12-03 09:02:30
【问题描述】:
我正在尝试从 c# 调用以下“foo”COM 方法:
interface IFoo : public IUnknown
{
virtual HRESULT __stdcall foo( BSTR * log ) = 0;
}
这是我在 c# 中的声明方式:
[ComImport, Guid( "98D93A58-2889-43a5-A182-47DEE781D41E" ),
InterfaceType( ComInterfaceType.InterfaceIsIUnknown )]
public interface IFoo
{
void foo( out string log );
}
这是我在 c# 中的调用方式: (x 是实现 IFoo 的 COM 类的一个实例)
string log;
x.foo( out log );
当我运行这段代码时,我得到以下异常:
System.Runtime.InteropServices.MarshalDirectiveException was unhandled
Message=Marshaler restriction: Excessively long string.
我做错了什么?
顺便说一句,如果我从 c++ 中调用“foo”,则以下内容可以正常工作:
CComBSTR log;
pX->foo( &log );
【问题讨论】:
-
我认为您不需要 C# 端的 out 说明符。
-
你可以控制
IFoo吗?如果您可以将 BSTR* 更改为 LPSTR*,则可以使用StringBuilder而不是String- 这就是为我解决此错误的原因
标签: c# interop marshalling