TypeForwardedTo, явно реализованные интерфейсы и события - PullRequest
2 голосов
/ 24 апреля 2020

Я пытаюсь реорганизовать кодовую базу. Это требует перемещения типов в разные сборки, чтобы исправить некоторые проблемы с зависимостями. Я хочу не требовать, чтобы мои клиенты перекомпилировали в результате этих изменений. Я заметил, что интерфейсы, которые явно реализованы и объявляют события, не пересылаются правильно. Например:

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? Есть ли способ получить поведение, которое я хочу?

1 Ответ

0 голосов
/ 24 апреля 2020

Похоже, что это ошибка в старой версии. NET Framework, который мы используем (4.5). Я обновился до 4.8, и он работает, как ожидалось. Я нашел это сообщение в блоге Рика Стрэла , которое описывает, как TypeForwardTo является тем, что делает. NET Стандарт, способный разрешать правильные цели. Это заставило меня понять, что оно должно работать для всех типов на более современной версии фреймворка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...