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

为了将代码注入现有程序集,我将使用Cecil库,它可以让您使用 IL。如果这是您所追求的,这将让您重写程序集。我必须警告你:这可不是一件小事。

哦,Reflector 还有一个插件,叫做 Reflexil,它可以让你编辑程序集。

顺便说一句,基于 AOP 的跟踪不会将代码直接添加到您的程序集中。您可以将所有 AOP 的东西保存在一个单独的程序集中(事实上,这是一个非常好的主意),然后将其与属性一起应用。PostSharp 将为您编写硬编码,但其他 AOP 框架(例如 Spring 或 PIAB)使用动态代理使事情变得更加灵活,因此您可以在不需要时有效地“关闭”您的切面。

于 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 回答
0

如果 doFoo 函数不是虚拟的,或者如果类不是通过接口访问的,则无法执行此操作。

原因是当您编译使用 doFoo 的类时,它会编译为调用该确切类上的确切函数。所以接收调用的目标类在编译时被评估。但是,如果该函数是虚拟的,或者您通过接口访问该类,则在运行时评估用于接收调用的目标类。

因此,为了使用任何 AOP(面向方面​​编程)或 DI(直接注入)框架来完成您想要的,目标类需要满足这些条件中的任何一个。通常通过接口访问类是首选方式。

那里有许多不同的 AOP 和 DI 框架,但这篇文章并没有说明要使用哪一个,所以我会阻止自己这样做,但如果你不需要这样的框架,你可以使用DynamicProxy来创建一个装饰器将日志记录功能添加到接口和具有虚拟功能的类中。后者创建一个新类,它是您已有的类的子类

于 2009-08-20T11:47:11.723 回答
-2

取决于您是否拥有程序集的源代码以及是否能够重新编译它以进行调试。

假设您有源代码,并且可以在启用调试的情况下编译它,那么您应该能够使用您的开发工具(我猜是 Visual Studio)单步执行代码并查看 X、Y 的值随你去吧。

这不需要修改代码 - 只需编译调试版本的能力。

于 2009-08-14T14:47:10.083 回答