小编Jas*_*onF的帖子

在Excel处于编辑模式时引发事件时,C#COM服务器事件"丢失"

我有一个用C#编写的进程内COM服务器(使用.NET Framework 3.5)基于此示例引发COM事件:http: //msdn.microsoft.com/en-us/library/dd8bf0x3(v = vs.90 )的.aspx

Excel VBA是我的COM服务器中最常见的客户端.我发现当我在Excel处于编辑模式(例如正在编辑单元格)时引发COM事件时,事件"丢失".这意味着,永远不会调用VBA事件处理程序(即使在Excel编辑模式完成之后),并且对C#事件委托的调用也会通过并静默失败,不会抛出任何异常.有谁知道如何在我的COM服务器上检测到这种情况?或者更好的是仍然使事件委托调用块,直到Excel退出编辑模式?

我试过了:

  • 检查事件委托的属性 - 找不到任何属性来指示无法在客户端上引发事件.
  • 直接从工作线程和主线程调用事件委托 - 在客户端上未引发事件,服务器上不会抛出异常.
  • 将事件委托推送到工作线程的Dispatcher并同步调用它 - 在客户端上没有引发事件,服务器上没有抛出异常.
  • 将事件委托推送到主线程的Dispatcher并同步和异步调用它 - 在客户端上不引发事件,服务器上没有抛出异常.
  • 检查Dispatcher.BeginInvoke调用的状态代码(使用DispatcherOperation.Status) - 状态始终以"已完成"结束,并且永远不会处于"已中止"状态.
  • 创建一个out-of-proc C#COM服务器exe并测试从那里引发事件 - 相同的结果,事件处理程序从未调用,没有异常.

由于我没有表明客户端没有引发事件,我无法在代码中处理这种情况.

这是一个简单的测试用例.C#COM服务器:

namespace ComServerTest
{
    public delegate void EventOneDelegate();

    // Interface
    [Guid("2B2C1A74-248D-48B0-ACB0-3EE94223BDD3"), Description("ManagerClass interface")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    [ComVisible(true)]
    public interface IManagerClass
    {
        [DispId(1), Description("Describes MethodAAA")]
        String MethodAAA(String strValue);

        [DispId(2), Description("Start thread work")]
        String StartThreadWork(String strIn);

        [DispId(3), Description("Stop thread work")]
        String StopThreadWork(String strIn);
    }

    [Guid("596AEB63-33C1-4CFD-8C9F-5BEF17D4C7AC"), Description("Manager events interface")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [ComVisible(true)] …
Run Code Online (Sandbox Code Playgroud)

c# com excel vba excel-vba

9
推荐指数
1
解决办法
1138
查看次数

标签 统计

c# ×1

com ×1

excel ×1

excel-vba ×1

vba ×1