2

我正在尝试为 Word 2010 编写一个加载项,该加载项将允许 .NET 应用程序注册来自加载项的自定义事件。我让它大部分工作,因为我的加载项运行正确,并且可以将一个对象传递给我的 .NET 片段,该片段实现了一个可供 .NET 应用程序使用的接口。这适用于基本方法调用,但是当我尝试注册接口中声明的事件时,我得到了这个异常:

Unable to cast object of type 'System.__ComObject' to type 'System.EventHandler'.

这是我的相关代码:

插件类:

public partial class ThisAddIn
    {
        private ExposedObject _obj;

        private void ThisAddIn_Startup(object sender, EventArgs e)
        {
            Application.DocumentBeforeSave += Application_DocumentBeforeSave;
        }

        private void ThisAddIn_Shutdown(object sender, EventArgs e)
        {
        }

        void Application_DocumentBeforeSave(Word.Document Doc, ref bool SaveAsUI, ref bool Cancel)
        {
            Doc.Paragraphs[1].Range.InsertParagraphBefore();
            Doc.Paragraphs[1].Range.Text = "This text was added by using code.";

            if (_obj != null)
            {
                _obj.DispatchUserActivityStarted();
            }
        }

        protected override object RequestComAddInAutomationService()
        {
            if (_obj == null)
            {
                _obj = new ExposedObject();
            }

            return _obj;
        }
    }

这是从加载项共享到 .NET 应用程序的对象的类:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class ExposedObject : StandardOleMarshalObject, IDocumentProcessor
{
    public event EventHandler UserActivityStarted;

    //same namespace as add-in
    internal void DispatchUserActivityStarted()
    {
        if (UserActivityStarted != null)
        {
            UserActivityStarted.Invoke(this, new EventArgs());
        }
    }
}

这是共享对象使用的接口:

[ComVisible(true)]
public interface IDocumentProcessor
{
    event EventHandler UserActivityStarted;
}

最后,这是 .NET 应用程序尝试使用加载项的方式:

var word = new Application();
word.Visible = true;
object addinName = "SampleWordAddIn";
var addin = word.Application.COMAddIns.Item(ref addinName);
var addinObject = (IDocumentProcessor) addin.Object;
addinObject.UserActivityStarted += OnUserActivityStarted;

private void OnUserActivityStarted(object sender, EventArgs e)
{
    //Do stuff
}

一切正常,直到addinObject.UserActivityStarted += OnUserActivityStarted;被调用的行,这是引发异常的地方。在这种情况下,我需要做什么才能附加到事件?

4

0 回答 0