确定互操作函数调用者

时间:2011-12-28 04:44:01

标签: c# vb6 interop

我正在使用以下属性向COM公开C#类:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("2325EBEB-DB5F-4D29-B220-64845379D9C5")]
[ComSourceInterfaces(typeof(WrapperEvents))]

在这个课程中我有一个功能:

public void shutdownService()

此函数只能通过COM Interop从VB6客户端调用一次。一切正常。但不知何故,它不止一次被召唤。我的C#代码不直接调用此函数。所以我猜这个问题是在VB6代码中。不幸的是,这不是VB6团队的想法。 有没有办法确定这个函数的调用者,即。从我的C#代码或VB6代码?

现在我正在使用一个简单的函数来获取堆栈跟踪:

    public void LogStack()
    {
        var trace = new System.Diagnostics.StackTrace();
        foreach (var frame in trace.GetFrames())
        {
            var method = frame.GetMethod();
            if (method.Name.Equals("LogStack")) continue;
            logger.Debug(string.Format("LogStack: {0}::{1}",
                method.ReflectedType != null ? method.ReflectedType.Name : string.Empty, method.Name));
        }
    }

显然,我在日志中得到了类似的东西:

2011-12-23 08:28:40,067 1          DEBUG (null) LogStack: Service::shutdownService

由于LogStack的唯一一行是COM公开函数,我假设它是从vb6调用的。但这并不足以证明VB6团队。任何想法如何真正证明功能在哪里?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下几种方法:

  • 在代码中设置断点以触发调试器,然后查看调用堆栈。 您可以从visual studio执行应用程序转储并将其发送给它们或截取堆栈。

离。 Debugger.Break

http://www.netsplore.com/PublicPortal/blog.aspx?EntryID=12

转储“Savre Dump As” http://msdn.microsoft.com/en-us/library/d5zhxt22.aspx

我还记得使用visual studio 6安装的工具也是这样做的