我在我的C#项目中添加了对COM Type Libary的引用。我看到了TlbImp创建的接口和对象类。其中一种接口方法的签名是:
string GetResString(int hr);
对应于C ++标头中定义的非托管对应项:
STDMETHOD(GetResString)(EMS_RESULT hr, /*[out,retval]*/ BSTR *pbszString);
当我使用以下方法调用上述方法时:
ITranslationObject translator = new TranslationObjectClass();
var str = translator.GetResString(2);
我收到一条消息“MfcVSApp1.exe中0x00000000处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。”
我尝试使用P / Invoke和DLLImport手动创建包装器,并且做了同样的事情。
这是我第一次尝试使用托管代码进行COM互操作,所以我可能错过了一些东西。请按照我的方式抛出任何想法,因为我需要这个。
TIA。
答案 0 :(得分:0)
狂野猜测......也许不是COM接口问题而是文件路径问题?确保COM DLL使用的文件的所有相对路径都与EXE相关,而不是DLL。使用COM,它们并不总是在同一个地方。
答案 1 :(得分:0)
例外是误导性的。实际的互操作没有问题。 Tlblmp关心的实体按预期工作。这个特定的COM对象需要在任何其他公开的方法之前调用Initialze方法,而我没有这样做。初始化COM对象后,不再抛出异常,并且interop按预期工作。感谢Hans P的小费。