【问题标题】:How to detect if my COM object is being used from a .NET application?如何检测我的 COM 对象是否正在从 .NET 应用程序中使用?
【发布时间】:2011-05-17 12:18:34
【问题描述】:

我有一个用 Visual C++ 编写的 COM DLL。我完全控制该 COM DLL 代码。当然,它可以从托管和非托管应用程序中使用。我想插入一个非常具体的检查,该检查仅应在 COM DLL 被 .NET 应用程序使用时运行。

我的 COM 对象是否有某种编程方式来检测它是从 .NET 应用程序还是从非托管应用程序消耗的?

【问题讨论】:

  • @sharptooth 我不知道这是否可能,但我很想知道你为什么要这样做?
  • @aphoria:我们想插入一个额外的检查,只有在 .NET 应用程序中使用它时才需要,否则会造成伤害。
  • 这似乎是一个相当奇怪的问题。也许您可以检查是否加载了 mscoree.dll,但我不确定指标的可靠性。例如,请参阅stackoverflow.com/questions/2080046/…(我喜欢 wj32 的回答)。
  • @sharptooth:您能否更具体地了解该检查?通常,被调用的 COM 对象不应该关心使用什么技术来实现调用者。
  • @Daniel Hilgarth:我想检查的不是那么重要——我只想写一个 if 语句,不知道要检查哪个条件。

标签: .net windows visual-c++ com com-interop


【解决方案1】:

这类“我的环境是什么”的问题总是有相同的答案。您的主机可以毫不费力地确定它是否是托管的,只需在您的界面中添加一个属性让它告诉您。与替代方案相比,这是一个微不足道的解决方案。这在 COM 中不可能可靠地实现,有很多托管服务器的方法。

【讨论】:

  • +1 这是一个很好的观点。当一个简单的解决方案可行时,过度设计一个很酷、巧妙的解决方案是很诱人的。 (我正在努力解决的问题。)从技术上讲,这并不能回答这个问题,但也许这是不可能的,这是最好的解决方案。
【解决方案2】:

两种可能:

  1. 创建一个本机 .NET 程序集,包装 COM 对象并对其进行适当初始化
  2. Try to detect whether your process is a .NET process 并忍受这些问题(无单声道检测、误报、在 DCOM/COM+ 上下文中使用时很可能是无效检测)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多