dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之前抛出 TypeLoadException 异常
本文将记录一个 dotnet 的已知问题。当自己不小心在方法上不正确标记了 MethodImplAttribute 特性时,错误选择了 MethodImplOptions.InternalCall 参数,那将会在运行的过程在,在此类型被访问之前就抛出了 System.TypeLoadException 异常,错误信息是 Internal call method with non_NULL RVA 内容
遇到这个错误时,是比较难定位到具体的问题的。首先异常信息里面最多只是带上了类型名,没有告诉咱具体是哪个方法调用错误了。其次,异常的信息是 System.TypeLoadException 异常,且异常内容里面没有十分明确说明具体问题。不过有了 Internal call method 关键词倒是还能根据此找到问题
更新:在 2023.12.16 官方已经修复此问题,将会有更加明确的错误提示。预计跟随 dotnet 9 发布
下面我将和大家演示一下错误在方法上标记了 MethodImplOptions.InternalCall 特性参数的行为,以下的代码可以在本文末尾找到下载方法
using System.Runtime.CompilerServices;
var f1 = new F1();
Console.WriteLine("Hello, World!");
class F1
{
public F1()
{
var f2 = new F2();
}
}
class F2
{
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public void Foo()
{
}
}
上面代码之所以需要定义两个类型,是因为这个异常是会在 F2 类型被访问到之前就抛出异常,这也就导致了更加难以调试。上面代码运行的时候,异常是抛在了进入 F1 类型的构造函数里面,如下图

这也就是导致了此问题更加难以调试的原因
在异常里面带上了 TypeName 属性,属性里面将会写明是 F2 类型出错,但是具体是哪个方法标记错了也没有更多的提示
我将此调试问题报告给 dotnet 官方,且官方已修复,请看 https://github.com/dotnet/runtime/issues/94967
更新: 现在可以拿到具体哪个类型的哪个方法标记错此特性
如果大家遇到了 System.TypeLoadException:“Internal call method with non_NULL RVA.” 异常,可以先看看这个异常里面的 TypeName 属性,确定是哪个类型出错了,然后再看看是否这个类型存在方法错误标记了 MethodImplOptions.InternalCall 特性参数导致运行失败
可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 96014b44231c7e6920abf4373521359705e8cb0c
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 96014b44231c7e6920abf4373521359705e8cb0c
获取代码之后,进入 GagageheLoqearrergi 文件夹
dotnet 已知问题 错误标记 MethodImplOptions.InternalCall 特性参数将会在类型访问之前抛出 TypeLoadException 异常的更多相关文章
- java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误
/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...
- Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出
Error:(12, 64) java: 未报告的异常错误java.io.IOException; 必须对其进行捕获或声明以便抛出 package com.test; import org.apach ...
- [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...
- Java知多少(49)throw:异常的抛出
到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下: throw ThrowableInstance;这里,Thr ...
- 窥探Swift编程之错误处理与异常抛出
在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...
- 使用CLOB抛出数字或值错误异常
今天在调试某个问题的时候,由于使用了很多循环,我需要都打印出来,试图使用clob整体处理之后再打印. 最后抛出此异常:数字或值错误. 网友解释如下: $ oerr ora 650206502, 000 ...
- 《从零开始学Swift》学习笔记(Day54)——抛出错误
原创文章,欢迎转载.转载请注明:关东升的博客 能放到try后面调用函数或方法都是有要求的,他们是有可能抛出错误,在这些函数或方法声明的参数后面要加上throws关键字,表示这个函数或方法可以抛出错误. ...
- PHP的异常处理、错误的抛出及错误回调函数
一.错误.异常和等级常量表 error:不能再编译期发现运行期的错误,不如试图echo输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断. exception:程序执行过程中出现意 ...
- 【python】raise_for_status()抛出requests.HTTPError错误
1.首先看下面代码的运行情况 import requests res = requests.get("https://www.csdn.net/eee", headers=head ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
随机推荐
- Babel解决ES6不能被所有浏览器解析问题
一.简介 1.ES6的某些高级语法在浏览器环境甚至是Node.js环境中无法执行. 2.Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行执行. 二.安装Babel ...
- 实现一个简单的echarts柱状图PythonFlask
bar.html 1 <!DOCTYPE html> 2 <html style="height: 100%"> 3 <head> 4 < ...
- Android弹出UI界面---Toast
1.默认展示 1 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this 2 // 第二个参数:要显示的字符串.也可是R.string中字符串ID 3 // ...
- #最大密度子图,0/1分数规划#UVA1389 Hard Life
题目 \(n\) 个点,\(m\) 条边的一个无向图,问导出子图的边数除以点数的最大值 分析 考虑二分这个答案,也就是0/1分数规划之后转换成 \(E-mid*V>0\) 这个问题虽然可以精确到 ...
- Android NDK之使用 arm-v7a 汇编实现两数之和
Android NDK之使用 arm-v7a 汇编实现两数之和 关键词: NDK armv7a WebRTC arm汇编 CMake 最近适配对讲程序,在webrtc的库编译的过程中,发现其为arm的 ...
- 开发人员使用HANA交付业务的学习路径
本文于2019年7月22日完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 入门 编程规范. 开发环境使用方法. 基本语法,与其它同类软件的 ...
- 使用OHOS SDK构建flac
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/xiph/flac 进入 ...
- 基于EtherNet/IP实现欧姆龙NX系列PLC通信
1.引言 工业以太网协议 (Ethernet/IP) 是由ODVA所开发并得到了罗克韦尔自动化的强大支持.它使用已用于ControlNet和DeviceNet的控制和信息协议 (CIP) 为应用层协议 ...
- 部署javaweb项目到阿里云ecs(centos7)
阿里云文档 https://help.aliyun.com/document_detail/51376.html?spm=5176.12901015.0.i12901015.af8f525cCPi8Q ...
- 教你构建一个优秀的SD Prompt
构建一个优秀的Prompt 在使用Stable Diffusion AI时,构建一个有效的提示(Prompt)是至关重要的第一步.这个过程涉及到创造性的尝试和对AI行为的理解.这里我会对如何构建一个好 ...