2011-01-22 14 views
9

は、私たちが組み立てA.dllのバージョン1でclass Xを持っていると仮定します2番目のアセンブリB.dllは、A.dllをロードし、Xを使用します。プロパティOtherPropertyを追加するとABIが破損しますか? B.dllは使用できませんA.dll/X?そうでない場合は、宣言の順番に違いはありますか?プロパティが仮想だった場合、それは何か違いがありましたか?C#インタフェースの破損、ABI

私は本当に尋ねていると思います:一般的なABIルールは何ですか?私は、公開された後のインターフェースの変更は悪いことを知っていますが、実際にを追加したい場合は、サブクラスを追加せずにプロパティを追加することもできます。

+1

を参照してください。.NET http:// stackoverflowのAPIを突破するための明確なガイド。com/questions/1456785/a-definite-guide-to-api-breaking-changes-in-net – Ani

+0

どのようにDLLをロードしていますか? –

+0

@マーク:私は、私のアセンブリのいくつかを参照する第三者のクライアントを持っています。私はいくつかのプロパティで拡張したいクラスのカップルを持っています。私は第三者がアセンブリを再コンパイルすることを要求することなく、そうしたいと思います。私はうまくそれらに尋ねることができたが、私はむしろそうしたくなかった。それはちょうどより多くのターンアラウンドタイムを追加します... –

答えて

6

プロパティを追加すると問題はありません。

たとえば、自動的に番号が付けられた列挙の途中に何かを追加すると、壊れてしまうケースが1つあります。あなたはあなたのライブラリーでこのコードがある場合例:

enum Foo 
{ 
    Bar, 
    Qux 
} 

を、あなたがこのように変更します。

enum Foo 
{ 
    Bar, 
    Baz, 
    Qux 
} 

その後、あなたはまた、このような任意のコードを再コンパイルする必要があります。

if (foo == Foo.Qux) 
{ 
    // ... 
} 
+0

具体的なクラスXを返すメソッドがあるとします。リファクタリングされたインターフェイスIXを返した場合、ABIを破ることはできますか? IXはアセンブリの最初のバージョンには存在しなかったので、私はそれを仮定します。 –

+0

@JörgenSigvardsson:ほとんどの状況でOK *するべきですが、うまくいかない場合があります。例えば、彼らがクラスを検査するためにリフレクションを使用している場合、ABIへの変更を見ることができ、理論的にはコードを壊す可能性があります。 –

+0

@MarkByersあなたはあなたの答えのいくつかの参考資料を提供できますか? – erick2red

2

アセンブリBによってちょうど使用されている場合、互換性が損なわれません。しかし、アセンブリBがインターフェイスを実装するクラスを定義している場合、そのクラスは新しく導入されたプロパティを実装していないため、ブレークします。

10

JITコンパイラは多くの問題を解決します。また、変更が壊れている場合は、エラーメッセージのソースも発生します。

しかし、あなたはDLL Hellと呼ばれる非常に危険なゲームをプレイしています。問題は、コードを再コンパイルしないということではなく、を実行するときです。です。彼らは、結局、そうなるだろう。微妙な間違いがある場合、インストーラの旧バージョンを実行していた人が間違ったファイルをコピーした場合、すべての地獄が緩んでしまいます。コードは実行されず、は不可能なジョブが理由を把握しています。これは、あなたが変更を行った後にはじめて起こります。何が間違っていたのかを推測する方法はありません。

[AssemblyFileVersion]と[AssemblyVersion]をバンプアップしないでください。はい、後者を変更したときに再コンパイルする必要があります。または、<bindingRedirect>を使用しても問題ありません。これで追跡可能なレコードがあります。

Btw:これは.NET Frameworkでも発生しています。 WaitHandle.WaitOne(int)はサービスパックに追加されましたが、[AssemblyVersion]の変更はありません。プログラマーは.NET 2.0をターゲットにしていましたが、ターゲットマシンに元の2.0がインストールされているとコードが実行されませんでした。 非常に痛いです。