8

これが可能かどうかさえわからないので、そうでない場合は申し訳ありません。私はかなり広範囲にグーグルで検索しましたが、探しているものが見つかりませんでした。

基本的に、サードパーティによって作成されたアプリケーションがありますが、これは完全に率直に言ってゴミです。特定の問題があり、ILSpy を使用して DLL 内のメソッドに問題を追跡することができました。明らかに、私たちはソース コードを持っておらず (入手することもできず)、問題の会社は妥当な時間内に問題を修正することを望んでいません。

そのため、さまざまな調査手段を調査しましたが、何も見つかりませんでした。これがリフレクションを使用して実行できるかどうかを調べてきましたが、これが機能する最後の希望です。一言で言えば、私がやりたいことは次のとおりです。

  • 既存の DLL と同じ名前の単純なクラス ライブラリを作成します。
  • リフレクションを使用して既存の DLL からメソッドをインポートする
  • どういうわけか、問題のメソッドを自分の正しいコードでオーバーライドします
  • コードを再構築して、既存の DLL の機能の 99% を含む新しい DLL を作成しますが、オーバーライド コードは正しい機能を提供します。

調査中に TypeBuilder.DefineMethodOverride と StackOverflow のページを見つけました。これは似ているように見えますが、探しているものとはまったく異なります。

http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.definemethodoverride.aspx

リフレクションでメソッドを「オーバーライド」する方法はありますか?

アドバイスをいただければ幸いです。

アンドリュー

編集

他に考えられるアイデアは、オーバーライド関数を含む部分クラスを作成することでしたが、それも実行可能ではないように思われました。

4

4 に答える 4

0

あなたが説明したことから、元のアセンブリを変更することをお勧めします。プロセスは基本的に

  • アセンブリを MSIL、C#、または任意の言語に逆コンパイルします。
  • 逆コンパイルされたアセンブリを変更して、変更を含めます
  • 変更されたソースを使用してアセンブリを再コンパイルします

私が見る限り、 Reflexilではそれが可能ですが、Resharper を購入する必要があるかもしれません (私自身は試していません)。

または、 ILDasmを使用してアセンブリ全体を 1 つのファイルに逆コンパイルし、ファイルを変更してからILAsmを使用して再コンパイルすることもできます。

于 2013-06-18T14:44:58.267 に答える
0

私はこれについて少し遅れていることを知っていますが、Charleh に同意します。うまく動作せず、置換を助長しないクラスを持っているが、少なくともそのメソッドを として宣言しているvirtual場合、あなたは幸運です。以下では、Castle.Coreおよびへの参照を使用していPatternsます。

var interceptor = new DelegateInterceptor(proceed: call => 
{
  if(ShouldCallProceed(call)) call.Proceed();
  else AlternativeLogic();
});

var generator = new ProxyGenerator();
var proxy = generator.CreateClassProxy<UncooperativeType>(interceptor);

proxy.RubbishMethod();

また、LinqPadで実行中のサンプルを自由に提供することもできました。virtual傍受を許可する方法 (もの) と許可しない方法の違いを示しています。Try.Doまた、すべてのコードで fromを使用せずに例外をトラップする便利な方法も示していますPatterns

于 2013-12-08T02:16:08.933 に答える
0

あなたの最初のアイデアは良いと思います。サード パーティのクラスが でない場合はsealed、そこから派生させ、別の名前で独自のメソッドを追加して、間違った動作を修正できます。1 つの dll にする必要がある場合は、IlMergeを使用できます。

サード パーティ クラスがシールされている場合は、新しいクラスにこのサード パーティ クラスのインスタンスを作成し、必要に応じてメソッドを呼び出すことができます。

ただし、「オーバーライド」するメソッドがそのライブラリ内で呼び出されていないことを確認する必要があります。その場合、このソリューションは機能しないためです...

あまりきれいではありませんが、ライブラリを編集している会社が問題を修正している間の一時的な解決策になる可能性があります。

そして、それが修正されたら、使用するメソッドの名前を変更するだけでよいので、時間はかかりません.

于 2013-06-18T14:36:17.827 に答える