Ign*_*cia 3 .net c# clr il interface
我在定义以下界面的应用程序中有一个程序集:
public void Method1()
Run Code Online (Sandbox Code Playgroud)
然后我有一个实现此接口的程序集插件.它在运行时被发现并加载.
后来我修改了界面以包含一个新方法:
public void Method1()
public void Method2()
Run Code Online (Sandbox Code Playgroud)
我创建了一个新的程序集插件,实现了新版本的界面.
有没有办法在应用程序上只部署新接口和新插件?目前客户端永远不会在第一个插件上调用Method2(),因此它不应该是一个问题(如果在第一个插件上调用Method2的话,我可以抛出异常).
我以为我能做到,但我得到一个TypeLoadException说法:
程序集'Provider2,Version2.0.0.0,Culture = neutral,PublicKeyToken = null'中的类型'Provider2.Class2'中的方法'Method2'没有实现.
(这是真的但是因为没有调用Method2应该不是问题)
您不应该修改该接口.
接口通常以两种主要方式之一使用:
在第一个选项中,您当然可以随意使用它,例如为其添加新方法.如果这会产生很多编译器错误,那么这是你自己的问题,你也可以"轻松"修复它们.
在第二个选项中,您永远不应该修改该接口.相反,您应该使用新方法创建一个新接口,然后编写代码,使其支持旧接口和新接口.
当然,除非您想要禁止旧班级完全工作,否则您将回到自己想做的任何事情.
所以这里的答案是你不应该修改那个界面.而是使用新方法创建一个新接口,并支持旧版本和新版本.
您应该在更改界面时努力使用此方法,这包括更多类型的更改,而不仅仅是添加方法.
如果您更改接口的含义,或修复主要的非灾难性错误,您可能需要引入新接口,并让旧接口具有旧错误.有人可能编写了依赖于旧行为的代码,无论好坏,并且你"修复"这可能会破坏以前工作的东西,即使编译器没有抱怨.
例如,假设您将比较结果传递给方法.您的文档指出,如果比较结果<为a >,则值为负,a 为0,0为0 ==.
然后你突然发现你没有返回-1,0或+1,你正在返回-N,0和+ N,其中N是某个数字,它是比较的副产品,例如结果A-B,所以在下一个版本中,您将其更改为-1,0和+1.
有些代码可能依赖于这样的事实,即值也代表不仅仅是比较的结果,但确实如此-N,因此您修复此问题会破坏该代码.
当然,依赖于未记录的行为总是很糟糕,但同样,您的客户很可能会因为代码以前的工作而被挂起,而且您的更新破坏了它.
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |