COM Interop:C#COM Class Wrapper抛出异常

时间:2011-07-04 22:07:55

标签: c# com interop

我在我的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。

2 个答案:

答案 0 :(得分:0)

狂野猜测......也许不是COM接口问题而是文件​​路径问题?确保COM DLL使用的文件的所有相对路径都与EXE相关,而不是DLL。使用COM,它们并不总是在同一个地方。

答案 1 :(得分:0)

例外是误导性的。实际的互操作没有问题。 Tlblmp关心的实体按预期工作。这个特定的COM对象需要在任何其他公开的方法之前调用Initialze方法,而我没有这样做。初始化COM对象后,不再抛出异常,并且interop按预期工作。感谢Hans P的小费。