Я пытаюсь реорганизовать кодовую базу. Это требует перемещения типов в разные сборки, чтобы исправить некоторые проблемы с зависимостями. Я хочу не требовать, чтобы мои клиенты перекомпилировали в результате этих изменений. Я заметил, что интерфейсы, которые явно реализованы и объявляют события, не пересылаются правильно. Например:
Foo.dll определяет:
public interface IFooInterface
{
void Foo();
event EventHandler FooEvent;
}
FooProgram.exe моего клиента зависит от Foo.dll и определяет:
public class Foo : IFooInterface
{
event EventHandler IFooInterface.FooEvent
{
add { }
remove { }
}
void IFooInterface.Foo() { }
}
Теперь я перемещаю тип , Я создаю новую сборку NewFoo.dll. Я перемещаю IFooInterface из старой сборки в новую и помещаю его в то же пространство имен. Foo.csproj берет ссылку на проект на NewFoo.csproj, и я добавляю атрибут пересылки:
[assembly: TypeForwardedTo(typeof(IFooInterface))]
Я помещаю Foo.dll и NewFoo.dll в каталог bin для ошибок Foo.exe и Foo.exe с :
Unhandled Exception: System.TypeLoadException: Method 'add_FooEvent' in type 'FooProgram.Foo' from assembly 'FooProgram, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.
at FooProgram.Program.Main(String[] args)
Почему это происходит? Если я неявно реализую интерфейс на Foo, он работает, но это не приносит мне никакой пользы, поскольку это означает, что любой, кто написал код vb. net для моей библиотеки, сломается. Какие еще конструкции имеют эту проблему с типом Fowrarding? Есть ли способ получить поведение, которое я хочу?