是否可以对 C# COM 接口实现进行故障排除?

Posted

技术标签:

【中文标题】是否可以对 C# COM 接口实现进行故障排除?【英文标题】:Is it possible to troubleshoot C# COM Interface Implementations? 【发布时间】:2010-01-14 19:32:24 【问题描述】:

我有一个 C++ COM 接口的 C# 实现。我已经尽可能准确地移植了 IDL(接口)。

当 C++ 应用程序实例化我的对象时,它会成功调用其中一种方法。然后它尝试调用另一个方法,但没有任何反应。第二个调用的执行路径永远不会到达 C# 端。

我无权访问 C++ exe 代码。我确实有一个带有代码的 COM DLL 对象的工作编译 C++ 版本。这就是我要在 C# 中替换的内容。

我可以使用什么来比较 C++ COM 和 C# COM DLL 的接口以查看是否有任何差异?这甚至可能吗?我已经尝试过微软的 OLE View,但它无法打开 C++ DLL。我想如果我能看到我的 DLL 看起来与 C++ 完全一样,它可能会工作。

这个问题更多的是帮助我了解我可以从这里去哪里。我已经问了一个非常详细的问题,关于我想要实现的确切实现,但没有人感兴趣。这就是为什么我要发布一个更一般的问题来帮助指导我找到答案。

我真的被困住了。这已经过去了 25 多个小时,呵呵。

【问题讨论】:

【参考方案1】:

您是否使用 InterfaceTypeAttribute 标记了 C# 接口以告诉 CLR 它应该将其封送为 IUnknown 或 IDispatch?

因为如果你不这样做,你在 VMT 中的方法槽就会被弄乱。

【讨论】:

是的,根据 IDL,它是 IUnknown【参考方案2】:

我不认为您可以编写自己的测试应用程序(C++ 或 C# 或两者)来运行您的 C# 实现并看看发生了什么?如果您已经这样做了,请随意忽略。

【讨论】:

【参考方案3】:

在解决了我的兼容性问题后,我发现 C++ dll 没有公开我期望的接口项。尽管这个问题旨在如何调试或比较 2 个 dll 的公开接口,但我通过在我正在实现的 C# 接口上使用 [ComImport] 属性而不是 [ComVisible(true)] 使我的项目工作。我在接口声明中使用了 [PreserveSig] 属性来强制兼容。这是我对正在发生的事情的理解。

【讨论】:

以上是关于是否可以对 C# COM 接口实现进行故障排除?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 NVIDIA nsight 对 WPF 性能进行故障排除吗?

网络无线故障排除

如何对苹果Mac屏幕自动降低亮度进行故障排除?

SD-WAN网络切换引起故障排除经验

如何对事件日志中的 .NET 2.0 错误报告消息进行故障排除?

对远程 jquery 插件请求进行故障排除