COM 互操作:C# COM 类包装器引发异常

Posted

技术标签:

【中文标题】COM 互操作:C# COM 类包装器引发异常【英文标题】:COM Interop: C# COM Class Wrapper throws exception 【发布时间】:2011-07-04 22:07:54 【问题描述】:

我在我的 C# 项目中添加了对 COM 类型库的引用。我看到了 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。

【问题讨论】:

这是 DLL 地狱。您使用的 COM 库与它的声明不对应。与图书馆的所有者交谈以获取其最新版本。 COM 代码本身崩溃当然也有可能,你还是想和同一个人说话。 感谢您的回复。没错,COM 代码崩溃了,因为我在尝试调用其他方法之前没有调用初始化方法。一切都很好。 【参考方案1】:

猜想...可能不是 COM 接口问题,而是文件路径问题?确保您的 COM DLL 使用的文件的所有相对路径都相对于您的 EXE,而不是您的 DLL。使用 COM,它们并不总是在同一个地方。

【讨论】:

【参考方案2】:

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

【讨论】:

很高兴你明白了。感谢您发布答案。

以上是关于COM 互操作:C# COM 类包装器引发异常的主要内容,如果未能解决你的问题,请参考以下文章

COM 互操作对象在一个项目中引发 InvalidCastException,但在其他项目中不引发

COM 互操作性需要强命名程序集?

COM 互操作 (CCW) 中的重载 - IDispatch 名称包括后缀(_2、_3 等)

将反射与 COM 互操作一起使用

casmcard 包装器

C# 包装器到 C++ 函数 - 运行一次,工作正常。运行两次,程序挂起