确定互操作函数调用者

本文关键字:函数调用 调用者 函数 互操作 | 更新日期: 2023-09-27 18:18:59

我正在使用这些属性向COM暴露c#类:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[GuidAttribute("2325EBEB-DB5F-4D29-B220-64845379D9C5")]
[ComSourceInterfaces(typeof(WrapperEvents))]
在这个类中,我有一个函数:

关闭服务

这个函数意味着通过COM互操作从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团队来说还不够。知道怎么证明函数吗?

确定互操作函数调用者

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

  • 在代码中设置一个断点来触发调试器,然后查看调用堆栈。你可以在这里做一个应用程序转储从visual studio发送给他们或者截图堆栈。

交货。调试器。打破

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

使用" save Dump As"进行转储http://msdn.microsoft.com/en-us/library/d5zhxt22.aspx

  • 使用com跟踪从系统级别看http://support.microsoft.com/kb/926098

我还记得visual studio 6中安装的一个工具也可以做到这一点