Я хочу, чтобы мой Excel vsto addin выставлял некоторые события для других дополнений. Как я понял, RequestComAddInAutomationService можно использовать, чтобы позволить другим вызывать некоторый код из моего дополнения. Чтобы избежать ссылки на надстройку из другого надстройки, я объявляю интерфейсы в отдельной библиотеке
//in some library
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IManager
{
void DoSmth();
}
//in the excel addin
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Manager: IManager
{
internal readonly static Manager Instance = new Manager();
private Manager(){}
public void DoSmth()
{
// ...
}
}
public partial class ThisAddIn
{
protected override object RequestComAddInAutomationService()
{
return Manager.Instance;
}
//...
}
, что позволяет мне вызывать метод DoSmth из разных надстроек в одном экземпляре класса Manager.
object name = "ManagerService";
return (IManager) application.COMAddIns.Item(ref name).Object;
Я попытался добавить событие в этот интерфейс и реализовать его:
//in some library
public delegate void MyDelegate(Worksheet worksheet, MyEventArgs e);
public class MyEventArgs : EventArgs
{
public string Value{get;}
public MyEventArgs(string value)
{
Value = value;
}
}
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IManager
{
void DoSmth();
event MyDelegate MyEvent;
}
Но попытки подписаться на это событие
object name = "ManagerService";
var manager = (IManager) application.COMAddIns.Item(ref name).Object;
manager.MyEvent += (worksheet, args) => {
//...
};
приводят к выбрасыванию System.InvalidCastException
и System.Reflection.TargetInvocationException
(в окне вывода); Мне не удалось найти какую-либо информацию о разоблачении событий с помощью RequestComAddInAutomationService. Итак, как правильно выставлять события с помощью интерфейса из надстройки Excel для других надстроек.