2

次のようなエントリ ポイントを持つアセンブリがあるとします。

int FooClass::doFoo(int x, double y)
{
   int ret;
   // Do some foo
   return ret;
}

次のようなものをシミュレートするために、さらに別のアセンブリを使用することは可能ですか?

int FooClass::doFoo(int x, double y)
{
   int ret;
   TRACE_PARAM_INT(x)
   TRACE_PARAM_DOUBLE(y)
   // Do some foo
   TRACE_RETURN_INT(ret)
   return ret;
}

また、DEBUG が存在する場合にのみ、このコード インジェクションを有効にします。そのような方法がある場合、「デバッグ」アセンブリをどのようにロードしますか?

編集 1: #ifdef はオプションではありません。たとえば、コード ベースを変更したくありません。

編集 2: 私の主な質問は、「既にコンパイルされたアセンブリにコードを挿入する方法」です。基本コードはありますが、そのメイン コードでトレースするために K 行を追加したくはありませんが、そのようなことを行う別のアセンブリがあります。私はVSを使用してデバッグする方法を知っています。私が望むのは、変数のトレースメカニズムを追加することです(とりわけ)。

4

6 に答える 6

10

PostSharpのような AOP ポストコンパイラを試すことができます。すべての .net 言語で動作しますが、C++ では試していません。

于 2009-08-14T14:44:48.137 に答える
3

既存のアセンブリにコードを挿入するには、IL を操作できるCecilライブラリを使用します。これにより、必要に応じてアセンブリを書き直すことができます。警告しておきますが、これは簡単なことではありません。

ああ、アセンブリを編集できる Reflexil と呼ばれる Reflector 用のアドインもあります。

ところで、AOP ベースのトレースでは、コードがアセンブリに直接追加されることはありません。すべての AOP 要素を別のアセンブリに保持し (実際、これは非常に良い考えです)、それを属性で適用できます。PostSharp はコードをハード ワイヤリングしますが、Spring や PIAB などの他の AOP フレームワークは動的プロキシを使用するため、物事をより柔軟にします。

于 2009-08-17T05:52:26.460 に答える
2

エンタープライズライブラリポリシーインジェクションアプリケーションブロックを使用すると、メソッド呼び出し間でコードを実行できます。メソッド内にコードを挿入するなど、質問で求めた複雑なことは実行されませんが、ニーズには十分であり、自由に利用できます。

于 2009-08-17T13:56:01.887 に答える
0

CThru(http://cthru.codeplex.com/Wiki/View.aspx?title=Using%20the%20CThru%20Engine)を見たことがありますか?

メソッド呼び出しやコンストラクター呼び出しなどをトレースできるため、外部からすべてをトレースできます。これはモックライブラリの一部ですが、はるかに便利です。

于 2009-08-20T08:05:20.470 に答える
-2

アセンブリのソース コードがあるかどうか、およびデバッグを可能にするために再コンパイルできるかどうかによって異なります。

ソース コードがあり、デバッグを有効にしてコンパイルできると仮定すると、開発者ツール (Visual Studio だと思います) を使用してコードをシングル ステップで実行し、X、Y の値を確認できます。あなたが行くように、そして、ret。

This would not requie modification of the code - just the ability to compile a debug version.

于 2009-08-14T14:47:10.083 に答える