在C#COM方法中使用BSTR作为字符串

时间:2014-03-24 14:09:21

标签: c# string com com-interop bstr

我的项目即将使用我正在处理的软件控制设备。为此,供应商提供了一个COM库。调用此库中的一个方法时遇到问题:

在COM库的(遗憾的是很快写的)文档中,我必须调用的方法定义如下:

Xclass *GetDeviceInterface(BSTR p_SerialNumber)

但是:Visual Studio总是告诉我必须在这个方法中添加一个字符串:

public virtual Xclass GetDeviceInterface(string p_SerialNumber)

因此,如果我将Device的序列号作为字符串而不是BSTR插入,我只能编译我的程序。出于测试目的,我在if情况下调用此方法(我只是检查是否返回了某些内容)。

IntPtr serialBstr = Marshal.StringToBSTR(serialNo);
if (obj1.GetDeviceInterface(Marshal.PtrToStringBSTR(serialBstr)) != null)
                    {
                        MessageBox.Show("fine");
                    }

但如果我这样做,我总会得到一个InvalidCastException:

System.InvalidCastException: Return argument has an invalid type. at System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(Object arg, Type paramType) at
System.Runtime.Remoting.Proxies.RealProxy.PropagateOutParameters(IMessage msg, Object[] outArgs, Object returnValue)
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at theUsedCOMLib.class1.getInterface(String serialNo) at MyProject.Form1.initialize() in path/to/my/file.cs:line 00

我认为它可以正常工作,如果我能用BSTR作为参数编译它。我可以以某种方式欺骗编译过程吗?或者只是忽略Visual Studio从库中读取的信息(说我需要这个方法的字符串)?

感谢您的帮助!

0 个答案:

没有答案