2012-07-13 28 views
0

我有一个C#类库,它是COM可见的,并从Visual Studio 6应用程序调用。其中一种方法需要返回一个字符串。我试过了这两种方法:从C#COM组件方法返回字符串

public void GetString(out string sText) 
{ 
    sText = MemberStringVariable; 
} 

当我从VC6调用上述函数时,我得到一个异常抛出。

public string GetString() 
{ 
    return MemberStringVariable; 
} 

当我调用上述(以BSTR *为参数)时,我得到一个NULL指针。

这样做的正确方法是什么?

+1

第二种方法是正确的。获得一个空BSTR *将表明MemberStringVariable只是简单的未分配。以混合模式使用调试器,以便您可以在C#代码中设置断点。 – 2012-07-13 16:25:18

回答

0

你的第二个方法:

public string GetString() { return MemberStringVariable; } 

应该工作。我一直这样做。 您在C++中获得的类型是_str_t,如comutil.h中定义的那样

+0

它不是,它是一个NULL BSTR *指针,我回来了。我需要在客户端分配字符串吗?这看起来很奇怪,因为我希望它被分配到另一端。毕竟我不知道这条绳子会有多长。 – Jonnster 2012-07-13 16:08:52

+0

@Joonster:你能用tlbexport生成tlb并发布签名(使用OLEView)吗?我的方法的签名就像'[id(0x60020007)] HRESULT get_Stuff([in] BSTR arg1,[out,retval] BSTR * pRetVal);' – 2012-07-13 17:15:44

+0

此外,您需要确保您的DLL已正确注册COM – 2012-07-13 17:16:33

0

请参阅this问题和答案。我怀疑你可以将string返回给本机代码。

+0

这实际上是其他方式。从C++返回字符串到C# – Jonnster 2012-07-13 16:15:34

+0

我在想你可以做同样的事情,从C++代码传递缓冲区到C#并且可以填充缓冲区。 – user845279 2012-07-13 16:20:43

0

哦,自从我做COM互操作已经有一段时间了,但我似乎记得您可能需要在您的方法的返回值上使用MarshalAsAttribute

[return: MarshalAs(UnmanagedType.Bstr)] 
public string GetString() 
{ 
    return MemberStringVariable; 
} 

更多示例请参阅http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshalasattribute(v=vs.100).aspx

+0

谢谢。这看起来很有希望,但实际上没有什么区别。 – Jonnster 2012-07-16 08:18:23