Как зарегистрироваться для настраиваемого события в офисной надстройке из .net - PullRequest
2 голосов
/ 20 декабря 2011

Я пытаюсь написать надстройку для 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; вызывается, где выбрасывается исключение.Что мне нужно сделать, чтобы присоединиться к событиям в этом случае?

...