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