私はちょっとした苦境に瀕しています。ASP.NET:コンパイルされたアセンブリから非仮想メソッドをオーバーライドする方法
ソースコードが利用できない既存のASP.NET Webアプリケーションを管理するタスクが割り当てられました。すべてのコードがコンパイルされ、binフォルダに入れられます。
ここでは、いくつかのメソッドの実装を変更する必要があります。これは、初めてこのような状況に対処しているので、これを実行するための最良の方法に関するご提案と推奨に感謝します。
私はちょっとした苦境に瀕しています。ASP.NET:コンパイルされたアセンブリから非仮想メソッドをオーバーライドする方法
ソースコードが利用できない既存のASP.NET Webアプリケーションを管理するタスクが割り当てられました。すべてのコードがコンパイルされ、binフォルダに入れられます。
ここでは、いくつかのメソッドの実装を変更する必要があります。これは、初めてこのような状況に対処しているので、これを実行するための最良の方法に関するご提案と推奨に感謝します。
@codymanixと一緒に言った。
アセンブリをILDASMで逆コンパイルしてください。必要なメソッドを仮想(または非開封)にします。 ILASMを使用して再コンパイルします。完了しました。
call
ではなく、callvirt
を使用するようにこれらのメソッドを呼び出す必要があります。
私はこのルートをとった。 –
@Saeb Amini:* Protip *:ILASMによって生成されたアセンブリで常に 'peverify'を実行します:) – leppie
たとえば、Reflectorツールを使用して逆コンパイルを試みることができます。 本当の質問です:もしあなたがこのアプリケーションを変更することが許されているソースコードを持っていない?
レガシーアセンブリ内のすべての内部参照が新しい実装を使用するように実装を変更する必要がありますか?そうであれば、レガシーバイナリを変更する必要があります(少なくとも維持するのは可能性がありません)。
お客様のニーズに対応するリファクタ(つまり、管理しているアセンブリからの参照)として、プロキシを作成し、レガシーライブラリへのすべての参照をプロキシに置き換えることをお勧めします。これにより、レガシーライブラリの動作をグラデーション拡張/変更することができます。道を進むと、これはあなたが何か他のもので遺産の図書館を変えることを可能にするでしょう。
彼の質問から、私は彼にはWebアプリケーションのソースコードがないことがわかりました。 –
@ジャスティン:はい。しかし、ライブラリの動作(すなわち注入コード)を変更することは、ライブラリの使用を変更する(すなわち、クリケットラッパーを書き込む)こととは全く異なります。 – larsmoa
CastleWindsors Dynamic Proxyのインタセプタのようなものでも、オーバーライドできるもの(静的メソッドなし、静的クラスなし、インターフェイスが必要)に関する制限があるため、恒久的な解決策ではありません。ファサードの作成や従来のAPIのラッピングは、(あなたが指摘したように)しばらくの間機能します。あなたが何かを打つまで、プロキシはできません。その後、レガシーAPIに大量の機能を再実装しています。 –
ソースコードがないと、どうすればそれを適切に維持できますか?他のすべてはちょうどハックです。 –
@ジャスティンシールド:私は同意する、したがって苦境。 –