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