从dll C#更改方法

本文关键字:方法 dll | 更新日期: 2023-09-27 18:28:12

我在解决方案中使用了avalondock 2.0 dll,我需要在另一个项目中从DockingManager.cs更改IOverlayWindowHost.GetDropAreas方法。但是,我不想在源文件中执行此操作。这个方法不是虚拟的,我不能像这个那样覆盖它

class CustomDockingManager : DockingManager
{
     override IEnumerable<IDropArea> GetDropAreas(LayoutFloatingWindowControl draggingWindow)
     {
          //some changes
     }
}

从dll C#更改方法

虽然一般不推荐使用,但您可以使用C#功能显式地重新实现接口的单个方法,如

class CustomDockingManager : DockingManager, IOverlayWindowHost
{
    IEnumerable<IDropArea> IOverlayWindowHost.GetDropAreas(LayoutFloatingWindowControl draggingWindow)
    {
        // ...
    }
}

请注意,这样就不能使用基本实现,必须从头开始编写方法。

您需要执行IL编织来更改非虚拟方法。你有很多选择。

  • Mono.ecil.检查这个其他问答;A可能会给你一些解决问题的方向:C#拦截/更改/重定向方法

  • PostSharp。如果您只想在执行某些方法之前和之后添加一些代码,PostSharp比手动发出中间语言更容易。您可以使用OnMethodBoundaryAspect属性来执行此操作。请参阅本文以了解方法方面:http://www.postsharp.net/blog/post/Day-4-OnMethodBoundaryAspect