【发布时间】:2015-07-18 19:59:43
【问题描述】:
在我的 VB.NET 应用程序中,事件 AppDomain.CurrentDomain.AssemblyResolve 订阅了一个处理程序。订阅此事件的 ResolveEventHandler 是从我的代码上游添加的(据我所知,System.AppDomain 有自己的 Private Method 订阅了该事件)...是否可以从此事件中删除所有处理程序,这样我就可以添加自己的处理程序并确保它是唯一的?
基本上我正在尝试这样做:
RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ClassX.MethodX
但我不知道这个例子中的ClassX 或MethodX 是什么,因为我还没有给这个事件添加处理程序,而且这个处理程序是由上游代码添加的。我正在使用此处描述的方法来检查是否有任何处理程序订阅了事件:
https://stackoverflow.com/a/2953318/734914
编辑:我能够在调试时使用即时窗口找出订阅事件的方法。
? DirectCast(gettype(System.AppDomain).GetField("AssemblyResolve", BindingFlags.Instance or BindingFlags.NonPublic).GetValue(AppDomain.CurrentDomain) , ResolveEventHandler)
{System.ResolveEventHandler}
_methodBase: Nothing
_methodPtr: 157334028
_methodPtrAux: 1827519884
_target: {System.ResolveEventHandler}
**Method: {System.Reflection.Assembly ResolveAssembly**(System.Object, System.ResolveEventArgs)}
Target: Nothing
现在我正在尝试像这样删除它,因为它不是公共方法:
RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf GetType(Reflection.Assembly).GetMethod("ResolveAssembly")
但这会导致编译器错误:“AddressOf 参数必须是方法的名称”。所以我不确定如何在这里指定非公共方法
【问题讨论】:
-
不,这是不可能的。
-
这是 winforms 应用还是类库?
-
我的代码在一个由 WinForms 应用程序加载的 ClassLibrary 中
-
这是一个关于从没有代表签名的事件中删除代表的主题:bytes.com/topic/c-sharp/answers/… .. 非常方便,但最后发帖人说
"It looks like AppDomain.CurrentDomain.AssemblyResolve doesn't support removal of events at all so the code I posted won't work.".. 甚至 .NET抱怨The event 'System.AppDomain.AssemblyResolve' can only appear on the left hand side of += or -=(+=/-=是 C#AddHandler/RemoveHandler) .. 所以它看起来像一个“不”:/ -
txttechhelp - 您链接中的这段代码正是我所需要的。请将您的回复作为答案发布,以便我将其标记为已接受。 GetInvocationList() 和 info.GetRemoveMethod().Invoke( ... )