什么会破坏 .net 二进制接口(dll)?

4
考虑两个.NET DLL。第一个“application.dll”包含主要的业务逻辑和数据访问代码。第二个“webservice.dll”主要由WebMethods组成,用于链接到application.dll中的对象和方法,以提供现有代码的Web服务调用。
在不需要重新编译webservice.dll的情况下,可以对application.dll进行哪些更改(例如添加新类、向现有类添加新字段或方法等)?
3个回答

3

大多数情况下都会很好,但以下情况会导致出现问题:

  • 删除已使用的类型(除非您正在使用类型转发)
  • 删除已使用的方法(包括构造函数)
  • 更改已使用方法的签名
  • 将公共字段更改为已使用属性
  • 更改序列化内部内容(如果使用序列化)
  • 在第二个dll中实现了一个接口,而您在该接口中添加了一个方法
  • 在继承自第二个dll中的基类中添加了一个抽象方法
  • 如果使用hacky反射,则几乎可以更改任何内部内容
  • 向泛型类型/方法添加约束
  • 将一个标记为sealed的类型标记为已继承的类型
  • 如果调用者使用成员初始化而不是构造函数初始化,则向struct添加字段

(删除包括将可访问性更改为非公共)


当你添加这个评论时,我已经在添加接口和抽象方法了 ;-p - Marc Gravell
非常全面的列表。干杯! - SillyMonkey

1

从技术上讲,名称会破坏它(在强命名程序集的情况下,名称、版本和密钥令牌)。否则,框架将“尝试”加载和使用DLL,并且这将工作得更好或更差,直到它遇到不同类型或方法签名、缺少类型等问题。但请注意,重新使用名称会直接回到DLL地狱(或其问题)。

我建议阅读更多关于程序集版本控制的内容,以了解如何解决此类问题。


在这种情况下,我宁愿它崩溃也不要加载过时的版本 ;) - SillyMonkey

0

只要您不调用应用程序.dll中添加的新类、函数,就可以对应用程序.dll进行任何更改而无需重新编译webservice.dll。 如果您想在webservice.dll中使用应用程序.dll的任何更改,则必须重新编译webservice.dll。

当然,如果您更改了应用程序.dll中被websrvice.dll使用的任何方法或属性的签名或访问级别,它将会破坏您在webservice中的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接