我在使用COM互操作时遇到了一些问题,情况如下:
一个32位的COM Exe服务器(用C++编程)提供了一个类和一些成员函数,处理第三方硬件(由于制造商不支持64位,这个硬件也将COM Exe服务器与32位绑定在一起)。
我想在64位的.NET(C#)应用程序中使用32位的COM Exe服务器...起初,我尝试在Visual Studio 2010中添加对Exe服务器的引用,它创建了一个Interop-DLL。这个Interop-DLL为我提供了必要的函数,其中一个被声明为:
int Initialize(ref string callingApplicationPath);
在C++中,原始声明如下:
LONG Class::Initialize(BSTR* callingApplicationPath)
在IDL中,代码应该像这样:
[id(1)] LONG Initialize([in] BSTR* callingApplicationPath);
然而,当我想通过Interop-DLL从C#调用此函数时,它会抛出BadImageFormatException异常。看起来Interop-DLL是一个32位DLL(也许有可能生成一个64位DLL?)。
我的下一步尝试是使用以下代码实例化Exe Server:
Type type = Type.GetTypeFromProgID("OurCompany.Class");
Object o = Activator.CreateInstance(type);
Object[] args = { Marshal.StringToBSTR(str) };
Object result = type.InvokeMember("Initialize", BindingFlags.InvokeMethod, null, o, args);
另一方面,这段代码会向我抛出一个TargetInvocationException异常(更具体地说:0x80020005(DISP_E_TYPEMISMATCH))。不幸的是,我无法从C#中找出需要传递给函数的类型......我尝试了Marshal类中的所有StringToXXX函数,但似乎没有任何作用 :/ 我想我可能错过了一些简单的东西,但我看不到是什么。
非常感谢您的帮助!
最好的祝福
克里斯蒂安
string
会自动转换为它。 - sharptoothBSTR*
用作“in”参数看起来真的很奇怪。 - sharptooth