Tag: 二进制兼容性

如何告诉vb6每次创建dll时都不要创建新版本的interfaces / com对象?

我有.NET代码使用的vb6 com服务器(ActiveX DLL项目) 每次我将更改放入vb6代码并生成dll时,我也必须重新编译我的.NET客户端代码,因为它看起来像VB6为接口和com对象生成新的GUID或版本。 我承认这是一个很好的做法,因为进行了更改,但我想禁用此行为,以便每次更新我的vb6 dll时都让我的.NET客户端代码相同。 无论对COM对象或COM接口做了哪些更改,我怎么能告诉VB6保持ActiveX dll的所有GUID和版本都一样?

添加枚举值是否会破坏二进制兼容性?

想象一下DLL中的这个枚举。 public enum Colors { Red, Green } 添加枚举值是否会破坏二进制兼容性? 如果我要改变它,现有的EXE会破裂吗? public enum Colors { Red, Green, Blue } 我看到了这个答案 ,但它似乎解决了插入值的问题。 如果我只在最后添加值,那可以吗?

C#接口破坏,ABI

假设我们在程序集A.dll版本1中有class X : class X { SomeType Property { set; get; } } 然后在程序集A.dll第2版​​中: class X { SomeType Property { set; get; } SomeType OtherProperty { set; get; } } 现在假设我们有第二个程序集B.dll加载A.dll并使用X.添加属性OtherProperty打破ABI吗? B.dll会不会使用A.dll / X ? 如果没有,声明的顺序会有什么不同吗? 如果属性是虚拟的,它有什么不同吗? 我想我真的在问:ABI的一般规则是什么? 我知道在发布之后更改接口是一件坏事,但我真的希望能够在某些情况下添加属性,而无需添加子类。

更改子类型的函数的返回类型是否会破坏二进制兼容性?

我们直截了当地说: 旧代码: public interface IFoo {} public class Foo : IFoo {} … public static IFoo Bar() { return new Foo(); } 新代码: public static Foo Bar() { return new Foo(); } 显然这里应该没有问题,你在旧的返回类型上做的所有事情,你仍然可以在新的返回类型上执行,任何is , as或者cast应该像以前一样… 那么我是否打破了二进制兼容性,或者我可以将其作为次要版本发布而不会打扰用户?

通过放弃.NET中的标准EventHandler模​​式我会失去什么?

.NET中的事件有一个标准模式 – 它们使用一个delegate类型,它接受一个名为sender的普通对象,然后是第二个参数中的实际“payload”,它应该从EventArgs派生。 从EventArgs派生的第二个参数的基本原理似乎非常清楚(请参阅.NET Framework标准库带注释的参考 )。 它旨在确保随着软件的发展,事件接收器和源之间的二进制兼容性。 对于每个事件,即使它只有一个参数,我们派生一个自定义事件参数类,它具有包含该参数的单个属性,这样我们就可以保留在未来版本中向有效负载添加更多属性而不破坏现有客户端代码的能力。 。 在独立开发组件的生态系统中非常重要。 但我发现零参数也是如此。 这意味着如果我的第一个版本中有一个没有参数的事件,我会写: public event EventHandler Click; ……然后我做错了。 如果我将来的委托类型更改为新的类作为其有效负载: public class ClickEventArgs : EventArgs { … …我将破坏与客户的二进制兼容性。 客户端最终绑定到一个内部方法add_Click的特定重载,它接受EventHandler ,如果我更改了委托类型,那么他们就找不到那个重载,所以有一个MissingMethodException 。 好的,那么如果我使用方便的通用版本怎么办? public EventHandler Click; 不,仍然是错的,因为EventHandler不是EventHandler 。 因此,要获得EventArgs的好处,您必须从中获取,而不是直接使用它。 如果你不这样做,你也可以不使用它(在我看来)。 然后是第一个参数, sender 。 在我看来,这似乎是一个邪恶耦合的配方。 事件触发本质上是一个函数调用。 一般来说,函数是否应该能够通过堆栈挖掘并找出调用者是谁,并相应地调整其行为? 我们是否应该强制接口看起来像这样? public interface IFoo { void Bar(object caller, int actualArg1, …); } […]

用于C#/ .NET API的向后兼容性的工具?

我找到了这个工具http://sab39.netreach.com/Software/Japitools/JDK-Results/46/ ,它使用javadoc检查不同版本的Java之间的向后兼容性。 是否有一个与C#/ .NET相当的工具? 以下是使用此工具对JDK 1.5和JDK 6 API进行比较的示例: http : //www.kaffe.org/~stuart/japi/htmlout/h-jdk15-jdk6