2019-8-31-dotnet-特性-DynamicallyInvokable-是用来做什么的
title | author | date | CreateTime | categories |
---|---|---|---|---|
dotnet 特性 DynamicallyInvokable 是用来做什么的
|
lindexi
|
2019-08-31 16:55:58 +0800
|
2019-7-27 11:7:34 +0800
|
dotnet
|
我在 Linq 很多函数都看到 __DynamicallyInvokable
这个特性,这是一个没有官方文档的特性,也许是用来优化反射
在堆栈 网找到了以下描述
这个 __DynamicallyInvokable
特性是没有官方文档的,好像是在 .NET Framework 4.5 的一个优化添加的特性,这个特性看起来是在优化反射缓存的值,可以让随后的反射代码运行更快。从源代码里面的 System.Reflection.Assembly.cs
文件可以看到以下描述
// 每个神奇的(blessed)的 API 都会添加 "__DynamicallyInvokableAttribute" 注释
// Each blessed API will be annotated with a "__DynamicallyInvokableAttribute".
// 这个 "__DynamicallyInvokableAttribute" 特性类是在他自己的程序集定义
// This "__DynamicallyInvokableAttribute" is a type defined in its own assembly.
// 所以他的构造函数总是一个 MethodDef 同时是 TypeDef 类型
// So the ctor is always a MethodDef and the type a TypeDef.
// 我们缓存此构造的 MethodDef 标记以便更快地进行自定义属性查找
// We cache this ctor MethodDef token for faster custom attribute lookup.
// 如果在程序集里面不包含这个特性,那么意味着这个程序集不存在任何神奇的(blessed)的 API 方法
// If this attribute type doesn't exist in the assembly, it means the assembly
// doesn't contain any blessed APIs.
Type invocableAttribute = GetType("__DynamicallyInvokableAttribute", false);
if (invocableAttribute != null)
{
Contract.Assert(((MetadataToken)invocableAttribute.MetadataToken).IsTypeDef); ConstructorInfo ctor = invocableAttribute.GetConstructor(Type.EmptyTypes);
Contract.Assert(ctor != null); int token = ctor.MetadataToken;
Contract.Assert(((MetadataToken)token).IsMethodDef); flags |= (ASSEMBLY_FLAGS)token & ASSEMBLY_FLAGS.ASSEMBLY_FLAGS_TOKEN_MASK;
}
源代码请看 Assembly.cs
2019-8-31-dotnet-特性-DynamicallyInvokable-是用来做什么的的更多相关文章
- dotnet 特性 DynamicallyInvokable 是用来做什么的
我在 Linq 很多函数都看到 __DynamicallyInvokable 这个特性,这是一个没有官方文档的特性,也许是用来优化反射 在堆栈 网找到了以下描述 这个 __DynamicallyInv ...
- ECMASCript 2019可能会有哪些特性?
最近这些年,ECMASCript标准发展节奏非常稳定,每年都会发布新的特性.那么,ECMASCript 2019可能会有哪些特性呢? ECMASCript语法提案的批准流程 JavaScript的标准 ...
- agentzh 的 Nginx 教程(版本 2019.07.31)
agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...
- ARTS Challenge- Week 1 (2019.03.25~2019.03.31)
1.Algorithm - at least one leetcode problem per week(Medium+) 986. Interval List Intersections https ...
- 2020届京东秋招正式批一面记录-Java开发-2019.08.31
京东一面总结 总共时间持续时间约40分钟 1.你用过集合类里面哪些是线程安全的,哪些是线程不安全的?分别举两个例子? 线程安全:HashTable以及ConcurrentHashMap 非线程安全:A ...
- 牛客CSP-S提高组赛前集训营2 ———— 2019.10.31
比赛链接 期望得分:100+20+20 实际得分:40+20+30 awa cccc T1 :基于贪心的思路,然后开始爆搜(雾 那必然是会死的,好吧他就是死了 #include<iostrea ...
- Beta冲刺(9/7)——2019.5.31
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...
- lyc——2019.10.31
10:判决素数个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y). 输入 两个整数X和Y(1 <= X,Y <= ...
- 使用C#的Conditional特性与Unity编辑器宏命令做条件编译
概要 在传统的C#项目中,用Conditional特性做条件编译时,需要在Visual Studio中项目的属性里添加上条件编译符号,用法参考这篇文章. 而在Unity项目中,条件编译符号需要在Uni ...
- 2019华工校赛 B - 修仙时在做什么?有没有空?可以来炼丹吗?
题目链接:https://ac.nowcoder.com/acm/contest/625/B 解法:这题其实就是求2^18个点内最近的两个点的距离.我们可以容易想到朴素解法:把每个点作为源点跑最短路取 ...
随机推荐
- 树上莫比乌斯反演+分层图并查集——cf990G
/* 树上莫比乌斯反演 求树上 满足 d|gcd(au,av) gcd(au,av)的对数f(d) 如何求: 建立200000层新图,即对于每个数建立一个新图 在加边时,给gcd(au,av)的约数层 ...
- NX二次开发-UFUN工程图更新视图UF_DRAW_update_one_view
NX9+VS2012 #include <uf.h> #include <uf_draw.h> #include <uf_obj.h> #include <u ...
- delphi 实现最小化系统托盘(rz控件最简单 评论)
1.new -->application 2.在form1中加入一个tPopMenu 命名为pm1 3.uses ShellAPI; 4.定义一个常量在 const WM_TRAYMSG = W ...
- 面试系列38 分库分表之后,id主键如何处理?
(1)数据库自增id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案 ...
- PKUSC加油加油加油!
一句话,把学过的掌握的甚至还未掌握的,都用上吧! 1.题目不要再再再看错了!在纸上记下关键字. 2.记得有预处理这个东西可以降低复杂度! 3.仔细阅读数据范围,取值范围的0要注意! 4.不要每次像开新 ...
- Java 集群高可用监控(结合阿里SLB)脚本
欢迎点评,大家一起来优化 计划思路: 只有在mysql slave java 进程状态都正常的情况下才允许nginx 运行, 否则就干掉它, 负载用的是阿里的SLB #bin/bash #邮件函数 ...
- Python: 生成器与迭代 generators and iteration
https://eastlakeside.gitbooks.io/interpy-zh/content/Generators/ 文章不是非常好 1,三个概念 可迭代对象 iterable, 迭代器 i ...
- p分位数的原理及计算
p分位数的原理及计算 大纲>> 1.统计上的分位数概念 2.分位数的计算方法及举例 2.1首先确定p分位数的位置(依据项数分为基数.偶数情况) 2.2 求上一步确定的p分位数位置处的具 ...
- java中的break continue
break语句 在任何循环语句的主体部分,均可用break控制循环的流程.break用于强行退出循环,不执行循环中剩余的语句.(break语句也在switch语句中使用) public class B ...
- C++和JavaScript脚本的相互调用
脚本调用C++相对比较容易,使用ATL组件只需要抛双接口即可,但在exe里如何做到呢?本文实现了在exe里脚本和C++的相互调用.在EXE里也需要对外抛送一个继承自IDispatch的接口.并需要重载 ...