C#-从BSTR获取字符串*

C#-从BSTR获取字符串*,c#,C#,在我正在开发的c#应用程序中,我使用API提取客户信息,并尝试获取用户电子邮件地址的字符串-API文档说明我可以调用对象上的以下命令来提取notefield字符串(只能通过此函数获取/设置电子邮件地址) 然而,当我用c#调用这个函数时,我得到了一个空字符串 string email = object.NoteField["Email"] 如何获取值?非托管BSTR*和托管字符串不是一回事。你需要在两者之间转换 应该做你需要的事。大致如下: IntPtr inPtr = Marshal.Stri

在我正在开发的c#应用程序中,我使用API提取客户信息,并尝试获取用户电子邮件地址的字符串-API文档说明我可以调用对象上的以下命令来提取notefield字符串(只能通过此函数获取/设置电子邮件地址)

然而,当我用c#调用这个函数时,我得到了一个空字符串

string email = object.NoteField["Email"]

如何获取值?

非托管
BSTR*
和托管
字符串
不是一回事。你需要在两者之间转换

应该做你需要的事。大致如下:

IntPtr inPtr = Marshal.StringToBSTR("Email");
IntPtr outPtr = object.NoteField[inPtr];
// or you may need to do this
// IntPtr outPtr;
// object.NoteField(inPtr, out outPtr);

string email = Marshal.PtrToStringBSTR(outPtr);
Marshal.FreeBSTR(inPtr);
Marshal.FreeBSTR(outPtr);
这对我有用

string s1 = Marshal.PtrToStringAnsi((IntPtr)outPtr);

如何将包含NoteField的dll包含到C#应用程序中?它是项目中的一个引用。感谢您提供了指向起始位置的指针(没有双关语),这将返回一个编译器错误“无法将类型'string'隐式转换为'System'!我已经更新,包括这一点。互操作是有效的。为了安全起见,最好在分配周围使用
try finally
块,这样,如果在第1行之后发生异常,并且某个外部对象捕捉到该错误并继续执行,则不会导致内存泄漏。这是不正确的(即使它确实对您有效)这是因为BStr字符串使用
wchar\u t
而不是
char
(每个字符两个字节),并且它们可以在字符串中包含空字符,而不仅仅是终止符。请看这里:
string s1 = Marshal.PtrToStringAnsi((IntPtr)outPtr);