我正在尝试为 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;
被调用的行,这是引发异常的地方。在这种情况下,我需要做什么才能附加到事件?