C# 是否可以删除您的类没有删除的VB.NET EventHandler';不加?

C# 是否可以删除您的类没有删除的VB.NET EventHandler';不加?,c#,.net,vb.net,C#,.net,Vb.net,在我的VB.NET应用程序中,事件AppDomain.CurrentDomain.AssemblyResolve有一个订阅的处理程序。订阅此事件的resolveventhandler是在我的代码上游添加的(据我所知,System.AppDomain有自己的私有方法订阅事件)。。。是否可以从此事件中删除所有处理程序,以便我可以添加自己的处理程序并确保它是唯一的处理程序 基本上,我正在尝试这样做: RemoveHandler AppDomain.CurrentDomain.AssemblyResol

在我的VB.NET应用程序中,事件AppDomain.CurrentDomain.AssemblyResolve有一个订阅的处理程序。订阅此事件的
resolveventhandler
是在我的代码上游添加的(据我所知,
System.AppDomain
有自己的
私有方法订阅事件)。。。是否可以从此事件中删除所有处理程序,以便我可以添加自己的处理程序并确保它是唯一的处理程序

基本上,我正在尝试这样做:

RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ClassX.MethodX
但是我不知道这个例子中的
ClassX
MethodX
是什么,因为我还没有向这个事件添加处理程序,而这个处理程序是由上游代码添加的。我使用此处描述的方法检查是否有任何处理程序订阅了事件:

编辑:调试时,我可以使用即时窗口确定订阅事件的方法

?  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参数必须是方法的名称”。因此,我不知道如何在这里指定一个非公共的方法,这是原始注释中的方法:

关于从没有代理签名的事件中删除代理的主题。。很方便,但最后海报上说

“看起来AppDomain.CurrentDomain.AssemblyResolve根本不支持删除事件,因此我发布的代码无法工作。”

甚至.NET也抱怨事件
System.AppDomain.AssemblyResolve
只能出现在
+=
-=
的左侧(
+=/-=
运算符是C#
AddHandler/removeholder
)。。所以这看起来像是一个“不”:/

此外,在编辑后,您无法执行以下操作的原因:

RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf GetType(Reflection.Assembly).GetMethod("ResolveAssembly")
因为关键字是运算符关键字,类似于作为运算符的
+
-
,所以
的AddressOf
对给定的过程进行操作,并且它必须是可在编译时推断出的过程名。函数返回一个类型,而不是一个已知的函数地址

然而,一切都没有失去

and函数实际上需要传入
对象
委托
AddressOf
在使用时被编译成
Delegate
),因此您不需要
AddressOf
来做您想做的事情,您需要一个

要做到这一点,我们可以使用一个方法,该方法接受一个
MethodInfo
对象。应该注意的是,由于您试图访问私有方法,因此需要指定
Reflection.BindingFlags.Instance
Reflection.BindFlags.NonPublic
(我说的是
,但您将对它们执行位
)的名称,例如:

GetType(Reflection.Assembly).GetMethod("ResolveAssembly", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)
因此,在此基础上调用
CreateDelegate
将得到以下代码

[Delegate].CreateDelegate(GetType(Reflection.Assembly), GetType(Reflection.Assembly).GetMethod("ResolveAssembly", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic))
但这相当冗长,所以让我们把它分解一下:

Dim type As Type = GetType(Reflection.Assembly)
Dim mi As Reflection.MethodInfo = type.GetMethod("ResolveAssembly", (Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic))
现在,我们可以通过以下方式在
AppDomain.CurrentDomain.AssemblyResolve
上调用
RemoveHandler

RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, [Delegate].CreateDelegate(type, mi)
除了AppDomain.CurrentDomain.AssemblyResolve
期望委托/事件签名匹配之外,我们需要将创建的委托强制转换为适当的类型:

RemoveHandler AppDomain.CurrentDomain.AssemblyResolve, CType([Delegate].CreateDelegate(type, mi), System.ResolveEventHandler)
现在可以通过事件处理程序中的反射来删除私有方法

警告!! 虽然这段代码将编译并运行,但我不能保证它的有效性或准确性,因为您正在处理框架和堆栈指针(本质上),因此,尽管它可能会运行并工作,但它也可能会产生小猫宝宝。。所以要小心


希望能有所帮助

不,不可能这样做。这是winforms应用程序还是类库?我的代码在winforms应用程序加载的类库中。下面是一个关于从没有委托签名的事件中删除委托的主题:。。非常方便,但海报最后指出,
“它看起来像AppDomain.CurrentDomain.AssemblyResolve根本不支持删除事件,因此我发布的代码无法工作。”
。。甚至.NET对事件“System.AppDomain.AssemblyResolve”的投诉也只能出现在+=或-=的左侧(
+=/-=
是C#
AddHandler/RemoveHandler
)。。因此,它看起来像是“否”。:/txttechhelp-您链接中的这段代码正是我所需要的。请将您的回复作为答案发布,以便我将其标记为已接受。GetInvocationList()和info.GetRemoveMethod()调用(…)