C# MethodInfo.Invoke捕获被调用函数的异常

一、C#高级进阶语法——反射(Reflection) 本文介绍了反射在.NET中的应用,主要包括:1)反射的基本概念,即通过元数据动态解析和使用程序集;2)三种加载DLL的方式(Load/LoadFrom/LoadFile);3)反射创建对象和调用方法的实现步骤;4)反射结合配置文件实现程序可配置化,支持动态切换数据库等场景;5)反射的特殊应用,如破坏单例模式和突破访问权限限制;6)反射调用方法的进阶用法,包括选择特定构造函数和执行不同参数类型的方法。通过反射机制,开发者可以实现更灵活的编程方式,提高系统的可扩展性和可维护性。 阅读详情

前段时间在使用反射机制动态调用函数(通过MethodInfo.Invoke)时,发现无法捕获被调用函数抛出的异常。研究后发现,被调用函数抛出的异常被TargetInvocationException包装了。

  • 可以通过以下方法处理被调用函数抛出的自定义异常:
			catch (System.Reflection.TargetInvocationException ex)
			{
				if (ex.InnerException != null)
				{
					Exception exTmp = ex.InnerException;
					if (exTmp is HoundException)
					{
						LogFile.ErrorFormat("Msg: {0}, Code: {1}", exTmp.Message, ((HoundException)exTmp).ErrorCode);
					}
				}
			}
  • 另外还可以使用代理的方法,被调用函数的异常不会被包装,代码看上去更舒服一些。
    时间关系没有测试,暂时记录下来,下次需要的时候可以试试。
class Program
{
    static void Main()
    {
        DelegateApproach();
        MethodInfoApproach();
    }

    static void DelegateApproach()
    {
        try
        {
            Action action = (Action)Delegate.CreateDelegate
                                   (typeof(Action), GetMethodInfo());
            action();
        }
        catch (NotImplementedException nie)
        {

        }
     }

    static void MethodInfoApproach()
    {
        try
        {
            GetMethodInfo().Invoke(null, new object[0]);
        }
        catch (TargetInvocationException tie)
        {
            if (tie.InnerException is NotImplementedException)
            {


            }
        }
    }

    static MethodInfo GetMethodInfo()
    {
        return typeof(Program)
                .GetMethod("TestMethod", BindingFlags.NonPublic | BindingFlags.Static);
    }    

    static void TestMethod()
    {
        throw new NotImplementedException();
    }
}
.NET动态委托优化:告别MethodInfo.Invoke性能瓶颈 在.NET中,动态执行用户输入的表达式(如数学公式)是常见需求,但直接使用反射调用MethodInfo.Invoke会导致严重性能损耗——99%以上耗时消耗在元数据查找与安全检查上。其本质是动态性与高性能的矛盾。通过动态生成强类型委托(如Func<double, double>),可将编译开销一次性完成,运行时获得接近原生方法的调用性能(约3纳秒)。该方案兼顾安全性、IDE智能提示与内存可控性,适用于教育绘图、金融风控、工业PLC等高频计算场景,是比Expression.Compile和Roslyn Scr 阅读详情

相关推荐

Unity开发中C#反射的核心原理、性能优化与实战应用

C#反射是.NET框架提供的一项核心技术,它允许程序在运行时动态地探查和操作自身的元数据。其原理是通过System.Type、Assembly等类,获取并分析程序集、类型及其成员(如方法、属性)的信息。这项技术的核心价值在于打破了编译时的静态绑定限制,为构建高度灵活、可配置的软件架构提供了可能。在工程实践中,反射广泛应用于依赖注入框架、插件系统、数据驱动的动态逻辑以及自动化工具链开发等场景。特别是在Unity游戏开发中,合理运用反射可以高效实现诸如动态组件添加、UI事件自动绑定、自定义序列化以及行为树节点加

weixin_30345577的博客 314

C# 使用反射调用方法(MethodInfo.Invoke方法)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace B002_使用反射调用方法_MethodInfo.Invoke方法_ { class Myclass { public int a; publi

波波诸葛伟 3498

Unity游戏逆向实战:动态调用il2cpp编译后的C#方法

在Unity游戏开发与安全研究领域,il2cpp编译技术将C#代码转换为本地机器码,使得传统的反射机制失效,游戏逻辑如同被“锁”在二进制中。理解il2cpp运行时的内存结构与API原理,是进行高级游戏逆向与动态分析的关键。通过IDA Pro等工具进行静态分析与动态调试,结合对il2cpp运行时API的深入运用,可以实现对编译后C#方法的精准定位与调用。这项技术在游戏安全研究、Mod开发与机制分析中具有重要价值,能够帮助开发者或研究人员在不接触源代码的情况下,动态交互并验证游戏逻辑,例如实现特定功能的调用或数

weixin_34054931的博客 368

C#中的Invoke

与第一种方式相比,这种方式更加简洁,但使用委托调用方法需要确保委托的签名与要调用的方法的签名匹配。第一个参数是要调用方法的对象实例,如果方法是静态的,则可以传递。是一个用于调用方法的方法,它能够在运行时动态地调用一个方法。第二个参数是方法的参数数组,如上面我们调用Sell方法。等异常,所以在实际使用中应该进行异常处理。在上面的示例中,我们首先创建了一个。方法都可以用于调用方法并传递参数。在上面的示例中,我们首先通过。委托对象,并将其初始化为。方法的调用可能会引发。

标准都是留给不爱的人,爱的本质是自由意志的沉沦 4983

c#Reflect中MethodInfo使用方法(字符串反射调用函数方法的实现)

QQ交流群:607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考 目录 1字符串调用 2函数方法 1字符串调用 private void test反射ToolStripMenuItem_Click(object sender, EventArgs e) { Type type = typeof(ReflectTest); object reflectTest = Activato...

挣钱花388的博客 896

C#里类MethodInfo的作用

MethodInfo是C#反射机制中的核心类,用于获取和操作方法的元数据信息,包括方法名、参数、返回值类型等属性。它支持动态调用实例方法和静态方法,适用于框架开发、插件系统等场景。虽然反射调用存在性能开销,但通过缓存MethodInfo实例可优化性能。使用时需注意安全性控制(如访问权限)和异常处理,避免参数不匹配等问题。

大坡3D软件开发 260

使用 MethodInfo 调用带参数的方法

参考来自链接https://www.cnblogs.com/CodingHiding/articles/3328362.html using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.L...

dd_zhouqian的专栏 5094

IEEE Transactions on Industrial Informatics(TII)投稿全流程解析:从准备到成功提交

本文详细解析了向IEEE Transactions on Industrial Informatics(TII)投稿的全流程,涵盖从投稿前的格式准备、内容结构优化到在线提交系统实操等关键环节。重点强调了遵守TII严格的格式规范、双盲评审要求以及如何构建有说服力的学术叙述,旨在帮助研究者提升稿件质量,顺利通过评审。

weixin_28396629的博客 1862

C# MethodInfo.Invoke 对应方法内部异常输出

TargetInvocationException: Exception has been thrown by the target of an invocation. 反射某个方法的时候,如果这个方法内部逻辑写出Bug了,try这个Invoke的时候只会抛出这个异常。具体的异常,需要把InnerException也输出出来才知道。 try { methodInfo.Invoke(instance, new object[] { }); } catch(TargetInvoc...

树莓吃的累 962

高通Camera HAL3调试实战:如何用camxoverridesettings.txt高效抓取日志与dump图像数据

本文深入探讨了高通Camera HAL3调试中camxoverridesettings.txt文件的高效应用,重点介绍了如何通过该文件精准控制日志输出级别与dump图像数据,帮助开发者快速定位移动影像系统中的问题。文章详细解析了日志分级配置、图像数据捕获技巧及典型问题排查流程,为高通Camera HAL3项目开发提供了实用技术点。

weixin_30315905的博客 861

OCCT(Open CASCADE Technology)入门-2.搭建开发环境

安装完成后,在【扩展】菜单下会看到【Qt VS Tools】菜单,打开子菜单【options】进入qt配置窗口。打开VS后随便创建一个新项目,进入开发环境主页,打开顶部菜单【扩展】->【管理扩展】打开管理扩展窗口。然后点击右下角【创建】,一路【next】即可,最后会进入到开发主界面,得到一个下面的工程结构。好了,到这里基本的环境我们已经安装好了,下面我们开始创建项目并配置开发环境。打开顶部菜单【项目】,点击最后一个菜单项【xxx属性】,进入项目配置界面。这里的配置一般不用改,我们看【Versions】

2501_91235145的博客 2875

使用 MethodInfo 调用带ref参数的方法

参考来自链接https://bbs.csdn.net/topics/70385719 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text...

dd_zhouqian的专栏 1059

基于虚拟阻抗重塑的构网型VSG变流器SISO序阻抗建模与宽频振荡抑制策略分析(面向高比例新能源并网场景)

本文深入探讨了基于虚拟阻抗控制的构网型VSG变流器SISO序阻抗建模技术及其在高比例新能源并网场景中的宽频振荡抑制策略。通过虚拟阻抗重塑,有效改善了变流器的阻抗特性,解决了次/超同步频段的振荡问题,并提供了参数设计、阻抗扫频验证等实用技巧,为新能源并网系统的稳定性提供了可靠解决方案。

weixin_29268385的博客 249

c# invoke()使用

c# invoke使用

qq_39314683的博客 601

Redis TLS 加密传输实战:从证书生成到安全配置

本文详细介绍了为Redis启用TLS加密传输的完整实战流程。从阐述TLS加密的必要性开始,逐步指导读者生成自签名CA和服务器证书,并深入解析Redis服务端的核心安全配置,包括端口设置、认证模式与性能优化。最后,提供了主流客户端连接示例及生产环境下的排错与运维最佳实践,帮助构建安全的Redis通信通道。

weixin_29274969的博客 515

Fiori Elements 从入门到精通开发教程的文章目录

Fiori Elements 开发技术相对 SAP 其他历史悠久,发展成熟的开发技术来说,是一个新事物。正因如此,迄今为止国内深入讲解 Fiori Elements 应用的中文材料几乎没有。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4706

c#-Invoke反射简单举例

c#-Invoke反射简单举例 一个最简单的C#反射实例,首先编写类库如下: namespace ReflectionTest {  public class WriteTest  {  //带参数的公共方法 public void WriteString(string s, int i)  {  Console.WriteLine("WriteString:" +

zhangbp的专栏 1万+

第44节:cesium 大雾效果(cesium自带)(含源码+视频)

cesium 大雾效果(cesium自带)

qq_29384639的博客 1702

C#中类型Type的GetMethod方法

C#中类型Type有个GetMethod方法,调用该方法可获取指定方法名的方法信息实例。 使用时,其参数一般为2个,一个是方法名称字符串(可设置条件忽略大小写),另外一个参数为搜索方法的条件枚举。 该方法返回的是MethodInfo类型的实例,获取到了这个实例之后,我们就可以调用并执行该方法了。 MethodInfo method = type.GetMethod( funcName , Bi

软件研发实战应用技术分享 1万+

IC 笔试真题之吾见——华为实习(1)

前言 今天(2022 04 07)刚建立了一个专栏《IC真题之吾见》,准备记录一些IC真题的见解,为以后找工作做一点准备。 刷题绝不是目的,以题代练,以题代学。 题目来自师兄申请 华为实习“设计”岗位 的笔试真题。 见解大部分来自自己学习的理解,也有部分超纲知识是网络检索得到,希望可以多多在评论区留言交流,共同进步! 有问题的地方也希望可以直接批评指正! 后面也会同步更新此专栏! 1、下列有关时序分析的描述正确的是() A. recovery时间,是指异步控制信号在有效时钟沿到达之后必须保持

记录所学,分享知识,结识挚友 8636

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Unity C#反射原理与性能优化实战:从数据驱动到编辑器工具

反射是.NET运行时提供的核心技术,允许程序在运行时动态探查、创建和操作类型信息,其原理基于程序集的元数据查询。这项技术的核心价值在于实现高度灵活、可扩展的架构设计,尤其适用于需要解耦和动态组装的场景。在Unity开发中,反射广泛应用于数据驱动的配置系统、编辑器工具扩展、插件架构和动态事件回调等实践。通过缓存反射对象、使用委托封装或表达式树编译等优化手段,可以显著降低性能开销。本文结合Unity IL2CPP环境特性,深入探讨了反射在编辑器工具链构建与运行时动态系统中的应用,帮助开发者在灵活性与性能间取得平

congji3817的博客 410

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

.NET动态委托生成:解决程序集反射调用性能瓶颈

在.NET中,动态加载程序集后通过MethodInfo.Invoke进行反射调用存在显著性能开销,根源在于元数据解析、JIT编译和类型验证等运行时成本。动态委托生成技术(基于Expression Trees或Reflection.Emit)可将反射调用降级为近乎原生的强类型函数调用,规避装箱拆箱与查表开销,实现百倍级性能提升。该方案兼顾灵活性与执行效率,适用于插件化架构、热更新系统及低延迟中间件等场景,是平衡动态性与高性能的关键工程实践。

chuji3953的博客 460

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: C#带错误代码的自定义异常
下一篇: 关于WPF的ComboBox中Items太多而导致加载过慢的问题
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值