是什么破坏了.net二进制(dll)接口

时间:2009-04-30 11:40:49

标签: .net dll interface binary

考虑两个.net dll。第一个,“application.dll”包含主要的业务逻辑和数据访问代码。第二个,“webservice.dll”主要由WebMethods组成,它们通过application.dll链接到对象和方法,目的是为现有代码提供webservice调用。

在不需要重新编译webservice.dll的情况下,可以也不能对application.dll进行哪些更改(例如添加新类,向现有类添加新字段或方法等)?

3 个答案:

答案 0 :(得分:3)

大多数事情都会好起来的;一些会破坏它的东西:

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

(删除包括将可访问性更改为非公开的内容)

答案 1 :(得分:1)

从技术上讲,名称会破坏它(在强名称组合的情况下,名称和版本以及密钥标记)。否则,框架将尝试加载和使用DLL,这将会或多或少地工作,直到它遇到不同的类型或方法签名,缺少类型等。但请注意,使用名称会直接回到DLL地狱(或其中的问题)。

我建议您详细了解assembly versioning以了解如何解决此类问题。

答案 2 :(得分:0)

只要您没有调用新类,函数[在application.dll中添加],您就可以对application.dll进行任何更改,而无需重新编译webservice.dll。 如果你想在webservice.dll中使用你的任何application.dll更改,那么你必须重新编译webservice.dll

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