C# ASP.NET:如何从已编译程序集中重写非虚拟方法?

C# ASP.NET:如何从已编译程序集中重写非虚拟方法?,c#,asp.net,overriding,compiled,C#,Asp.net,Overriding,Compiled,我有点左右为难 我被分配了维护现有ASP.NET web应用程序的任务,该应用程序的源代码不可用-所有代码都被编译并放入bin文件夹 现在我需要更改一些方法的实现,这是我第一次处理这种情况,因此我非常感谢您对最佳方法的建议。您可以尝试使用工具Reflector对其进行反编译。 真正的问题是:如果没有源代码,是否允许更改此应用程序?是否需要更改实现,以便旧程序集中的所有内部引用都使用新的实现?如果是这样的话,就不能这样做,因为这将要求您更改遗留二进制文件(至少在维护方面不太合理) 对于针对客户机需

我有点左右为难

我被分配了维护现有ASP.NET web应用程序的任务,该应用程序的源代码不可用-所有代码都被编译并放入bin文件夹


现在我需要更改一些方法的实现,这是我第一次处理这种情况,因此我非常感谢您对最佳方法的建议。

您可以尝试使用工具Reflector对其进行反编译。
真正的问题是:如果没有源代码,是否允许更改此应用程序?

是否需要更改实现,以便旧程序集中的所有内部引用都使用新的实现?如果是这样的话,就不能这样做,因为这将要求您更改遗留二进制文件(至少在维护方面不太合理)


对于针对客户机需求的重构(即来自您可以控制的程序集的引用),我建议您编写代理,并用代理替换对旧库的所有引用。这允许您逐步扩展/更改遗留库的行为。接下来,这将允许您使用其他内容更改遗留库。

以及@codymanix所说的内容

只需使用ILDASM反编译程序集。使所需的方法成为虚拟的(或未密封的)。用ILASM重新编译。完成了


您可能必须修复对这些方法的调用才能使用
callvirt
,而不是没有源代码的
call

,如何正确维护它?贾斯汀:我同意,因此陷入了困境。从他的问题中我看到他没有任何来自web应用程序的源代码。@贾斯汀:是的,但是改变库的行为(即注入代码)与改变库的使用(即编写clinet包装器)是完全不同的。即使使用Castle Windsors Dynamic Proxy中的拦截器也不是一个永久的解决方案,因为您可以覆盖的内容存在限制(没有静态方法,没有静态类,并且需要一个接口)。编写一个facade或包装遗留API可以工作一段时间(正如您所指出的)。直到你击中了你无法代理的东西。然后你就被困在传统API中实现大块的功能上了。@Justin:当然。代理/包装只是替换/重新实现之前的一个中间阶段。我最终选择了这条路线。@Saeb Amini:Protip:始终对ILASM生成的程序集运行
peverify