【问题标题】:TypeForwardedTo, explicitly implemented interfaces and eventsTypeForwardedTo,显式实现的接口和事件
【发布时间】:2020-04-23 22:09:44
【问题描述】:

我正在尝试重构代码库。这需要将类型移动到不同的程序集以修复一些依赖问题。我想避免因为这些更改而要求我的客户重新编译。我注意到显式实现并声明事件的接口无法正确转发。例如:

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 代码的人都会崩溃。还有哪些其他构造与类型转发有此问题?有没有办法得到我想要的行为?

【问题讨论】:

    标签: c# .net vb.net


    【解决方案1】:

    看起来这是我们正在使用的旧版本 .NET Framework (4.5) 中的一个错误。我升级到 4.8,它按预期工作。我发现 this blog post by Rick Strahl 描述了 TypeForwardTo 如何使 .NET Standard 能够解析到正确的目标。这让我意识到它必须适用于更现代版本的框架上的所有类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多