最近、古いバージョンのDLLとの互換性を確保するために、コードを変更する必要がありました。DLLは同じ名前であり、署名されていません。違いは、新しいDLLに追加されたいくつかの追加メソッドにもあります。
私には正しくないように思われるこれを回避する1つの方法は、プロジェクト内の新しいDLLを参照し、ビルドして実行することです。他のDLLを使用する場合は、binフォルダーでそれを置き換えるだけです。Reflectionを使用してコンストラクター内のメソッドの存在を確認するだけでエラーを回避し、フラグを設定して、古いバージョンを使用している場合に後で新しい関数を呼び出さないようにすることができます。
私にとって奇妙なことは、古いバージョンを使用すると、次のコードが機能しないことです。
int[] someVariable = (DLLIsNewFormat) ? DLL.CallNewMethod() : new int[5];
基本的に何が起こっているのかというと、DLLIsNewFormatはFalseですが、何らかの理由でエラーが発生します。
メソッドが見つかりません:'Int32 [][NameSpace]。[Class].CallNewMethod()'。
これを実行する最善の方法は、おそらく各関数が存在するかどうかを確認してから、リフレクションを使用してそれらを呼び出すことであることを理解しています。しかし、なぜコードがこのように動作しているのかわかりません。これは未定義の動作ですか?