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,但在其他项目中不引发