是否可以对 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 性能进行故障排除吗?