サードパーティの dll を参照する C# dll があります。サードパーティの dll にはさまざまなバージョンがあります。
ご想像のとおり、最新のサード パーティの dll が存在する場合は新しい機能を使用したいのですが、そうでない場合は古い機能を実行したいと考えています。
これを実現する方法がわかりませんでしたが、最初に試すことは、呼び出す関数を決定する単純な if ステートメントになると思いました。
したがって、アセンブリを見つけて、その場所を取得し、そのバージョン情報を取得します。(製品のバージョンは同じなので、ファイルのバージョンが必要です)。
次に、単純な
if (version >= 3) do x() else do y()
バージョン 2 がインストールされているマシンでコードを実行すると、関連するMissingMethodException
メッセージが表示されx()
ます。私はばかげた間違いを犯したと思ったが、論理は正しかった。バージョンは2なのでx();
実行しないでください。問題のあるメソッドを削除して、に置き換えることにしましたthrow new Exception()
。例外はスローされず、コードは正常に完了します。
ここに危険があります-これは分岐予測によるものだと考えています。これは私が知識を持っている分野ではないため危険です。したがって、仮定を立てることは危険なことです。
だから私の質問は:
私はこの問題に間違った方法で取り組んでいますか?私が見逃しているより明白な解決策はありますか?
また
分岐予測を無効にする方法はありますか (それが原因である場合)、続行する前に実行する必要があるポイントとして if 条件を強制/フラグ付けする方法はありますか?
実行中のコードは次のとおりです。
- バージョン 3 がインストールされているマシンでは問題ありません。
- バージョン 2 がインストールされているマシンでは、
MissingMethodException
関連メソッドが取得されx()
ます。 - への呼び出しを削除し
x();
、例外のスローをコメント解除すると、例外はスローされません。
関連コード:
Assembly assembly = System.Reflection.Assembly.GetAssembly(typeof(3rdPartyClass));
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
if (fileVersionInfo.FileMajorPart >= 3)
{
// throw new Exception("aagghh");
x();
}
else
{
y();
}