3

アセンブリ バージョンを適切に設定し、それをリフレクションで取得することに問題がありました。回避策を見つけましたが、なぜこのように動作するのかまだ興味があります...

私はクラス ライブラリ プロジェクトを持っています。それを読み込んで、次のコードでバージョンを読み込んでいます。

var assembly = Assembly.LoadFrom(assemblyName);
var version= assembly.GetName().Version;

そして、私は良い結果を得ます:

assembly {AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
version  "1.0.0.0"

しかし、クラス ライブラリ プロジェクトで、アセンブリ バージョン フィールドとファイル バージョン フィールドの値を 2.0.0.0 に変更しました。私はそれをコンパイルし、IL DASM を実行して両方のライブラリを比較しました。

IL DASM のどこでも、つまりメイン ウィンドウ、マニフェスト、Metainfo で、新しいライブラリのバージョンが 2.0.0.0 で、以前のライブラリのバージョンが 1.0.0.0 であることを確認できたので、すべてが正しいことに満足しました。

しかし、アプリケーションに戻り、アセンブリをバージョン 2.0.0.0 でロードしました。結果は次のとおりです。

assembly {AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null}
version  "1.0.0.0"

したがって、リフレクションは適切なバージョン値を返しません。回避策は、FileVersionInfo クラスを使用することです。

FileVersionInfo.GetVersionInfo(assemblyName).FileVersion;

これで適切な結果が得られました。

私の質問は次のとおりです。リフレクション メカニズムによって適切なバージョンを取得できるようにするには、クラス ライブラリ プロジェクトで他に何を変更する必要がありますか? IL DASM が適切なバージョンを表示し、リフレクションが表示されないのはなぜですか? ボンネットの下の IL DASM は反射を利用しているといつも思っていましたが、今では

すべての回答に感謝します。

4

1 に答える 1

-1

OK私はそれを解決することができました。問題は、Assembly クラスからの読み込みメソッドにありました。

Assembly.LoadFrom を DLL へのフル パスを引数として使用していました。ライブラリをバージョン 2.0.0.0 でロードしているときに、Assembly.LoadFrom が最初のライブラリを返していることに気付きました。2.0.0.0 ではなく、ライブラリ バージョン 1.0.0.0 の場所を指していた CodeBase プロパティで確認しました。 .

読み込みコードを Assembly.LoadFile に変更したところ、正しく動作するようになりました。

var assembly = Assembly.LoadFile(assemblyName);
于 2013-05-07T14:17:03.763 に答える