元编程技术和动态编译

利用C#的动态类型来实现与rails类似的元编程(1) 熟悉ruby on rails的开发员都知道,在ruby中,有一个很重要的特性,就是能够实现元编程,特别是在用于开发Web应用的rails框架中,用的特别多。在rails中,要创建一个动态方法并与数据库表字段相关联,主要的的步骤大概有这些:1、首先配置好数据库的连接。2、创建一个ActiveRecord模型,这个模型与数据库的表名称有一定的关系(具体的可以参考相关rails文档)3、创 阅读详情

原文:http://www.cnblogs.com/windsails/archive/2004/09/07/40754.aspx

 

元编程技术和动态编译

什么是元编程?

运行时动态创建类型的功能称为元编程。(这个是.NET环境编程全景中的定义)


从学习UML就知道meta-的重要性了,再后来了解到MOF(MetaObjectFacility)就更加着迷这个Meta-。
Meta-  在...之中... 对于想真正了解一个Framework,了解它的Meta东西是十分重要的。不管任何一个Framework,肯定存在着它自己的MetaData的,.NET作为一个Framework自然也存在好多元数据,我们编写应用程序中如果可以灵活的运用元编程技术,肯定可以使我们的程序更加灵活,高效甚至自我生成。

下图展示了.NET Framework中和元编程有关的类:

例如下面这个例子直接生成一个Dll,并且调用这个Dll中的动态方法:

using  System;
using  System.Reflection;
using  System.Reflection.Emit;
using  System.Threading;

namespace  testMetaProg
{
    
/// 
    
/// Class1 的摘要说明。
    
/// 

    class Class1
    
{
        
/// 
        
/// 应用程序的主入口点。
        
/// 

        [STAThread]
        
static void Main(string[] args)
        
{
            
//
            
// TODO: 在此处添加代码以启动应用程序
            
//
            AssemblyName an = new AssemblyName();
            an.Name 
= "myMetaProg";
            AssemblyBuilder ab 
= Thread.GetDomain().DefineDynamicAssembly(an,AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder mb 
= ab.DefineDynamicModule("MetaProgModule","myMetaProg.dll",true);
            TypeBuilder tb 
= mb.DefineType("MetaProg.NewType",TypeAttributes.Public);
            MethodBuilder m 
= tb.DefineMethod("MetaProgMethod",MethodAttributes.Public,null,null);

            CreateMethodBody(m);
            tb.CreateType();
            ab.Save(
"myMetaProg.dll");
            
            Type t 
= Type.GetType("MetaProg.NewType,myMetaProg",true);
            Object o 
= Activator.CreateInstance(t);
            MethodInfo myMethod 
= t.GetMethod("MetaProgMethod");
            myMethod.Invoke(o,
null);
            myMethod 
= t.GetMethod("ToString");
            Console.WriteLine(myMethod.Invoke(o,
null));
            
        }


        
private static void CreateMethodBody(MethodBuilder m)
        
{
           ILGenerator il 
= m.GetILGenerator();
           il.EmitWriteLine(
"输出一个新的类型:");
           il.Emit(OpCodes.Ret);
        }

    }

}

生成结果:


用ILDASM看生成的Dll,发现确实是个有效的CLR文件:

其中MetaProgMethod的方法对应的IL如下:




思考:
元编程似乎也可以动态直接生成编译后的效果文件了,而Microsoft.CSharp.Compiler也有一个编译类,
可以将输入的cs格式文件编译出Dll的,两者有何区别?那种更好?

下载 例子代码
提示词编程语言的元编程能力 提示词编程语言的元编程能力 关键词: 提示词编程语言、元编程能力、动态编译、代码生成、自动化脚本、应用程序开发 摘要: 本文将探讨提示词编程语言的元编程能力,包括其基本概念、核 阅读详情

相关推荐

Java内存中动态编译与执行代码实战

Java动态编译是指在程序运行期间,动态生成Java源代码并即时编译为字节码,进而加载执行的技术。该机制突破了传统静态编译的限制,使Java应用具备更高的灵活性与扩展性。虽然提供了获取系统编译器的标准方式,但在某些高级场景中,我们可能需要接入第三方编译器,或者自定义实现以增强灵活性和扩展性。自定义的主要目的是替代默认的编译器行为,例如使用其他编译器(如 ECJ)、或对编译流程进行拦截和增强。

weixin_33298352的博客 1128

动态反射

在我们之前的文章,反射的第一部分:发现和执行里,我们已经介绍了System.Reflection命名空间及其包含的类,开发人员使用这些类可以查看程序集的元数据,并且可以在运行时查找和发现类型,甚至可以调用发现的代码。在这篇文章中,我们将探讨反射的高级功能:Emit,它具有在运行时

巴萨,足球的艺术 1009

WinForm布局

登录模板页面UILoginForm

m0_71541781的博客 470

探索动态程序集

探索动态程序集 Written by Allen Lee         我相信,当你看到标题中“动态程序集”(Dynamic Assembly)这个字眼时,就冒出了很多想法和问题,然而,在我们深入这个概念之前,先来看看我遇到了什么问题。 1. 发生了什么事?A:我们的客户要处理一组 Shape 对象。B:怎么处理?A:计算其中每个对象的面积。 这点需求实在

Allen Lee's Magic 539

3D坐标系转换实战:如何用Python快速实现旋转矩阵与平移向量的组合变换

本文详细介绍了如何使用Python和NumPy实现3D坐标系转换中的旋转矩阵与平移向量的组合变换。通过齐次坐标和变换矩阵的数学原理,结合代码示例,帮助开发者高效处理机器人路径规划和计算机视觉中的空间变换问题,并解决实际应用中的常见错误。

pluto的博客 959

WorkBuddy结合DeepSeek与Skill:文献检索自动化与Token成本控制实战

Agent工具与大模型API的结合正重塑知识工作者的日常流程。在实际工程中,调用大模型处理批量任务常面临Token消耗过快、成本不可控的痛点,而国产大模型DeepSeek以极低的API定价和兼容OpenAI接口的特性,为规模化文本处理提供了“Token自由”的可能。同时,可复用的Skill机制能够将特定领域的工作流固化为标准化步骤,让Agent自动执行检索式生成、文献筛选与摘要归纳等复杂操作。本文从这一技术背景出发,以科研文献检索为应用场景,演示如何利用WorkBuddy、DeepSeek API与自建文献

weixin_29061509的博客 491

.NET Emit 入门教程:第二部分:构建动态程序集(追加构建静态程序集教程)

在本章节中,我们讨论了如何使用 C# Emit 来构建动态程序集,以获得 AssemblyBuilder 这个程序集构建器,开启构建程序集的第一步。在之后的文章,我们会讲解如何用它的 DefineDynamicModule 来定义模块,以之后构建类、成员、方法等,来实现构建完整的程序集。当然,对于构建动态程序集,本文章到此会显的有点简单,为了避免被大伙说文章太水。于是,打算追加一下对于构建静态程序集(即持久化程序集)的相关知识。

ts16dmy的博客 341

智慧工地算法视频分析服务器区域入侵检测AI视频分析技术在煤矿的实战应用

通过实时分析和处理井下视频资料,智慧矿山算法视频分析服务器不仅能够及时发现并预警人员违规行为和设备异常状况,还能够通过智能分析预防潜在的安全风险,从而显著提高煤矿的安全管理水平和生产效率。

EasyDarwin开源社区技术博客 560

反射发出动态类型(上)

引言   动态类型(Dynamic Types)可以向框架开发者提供高效的抽象编程模型,而不会产生通常因抽象而导致的性能损失。通过对面向接口编程和工厂设计模式的使用,可以开发一个框架,它既享有抽象编程模型通用的好处,同时也兼具硬编码逻辑的性能优势。   动态类型工厂使用程序基本元数据,确定以最佳的方式在运行时建立新类型。类代码被直接“发出”到内存中的程序集中,无需通过.NET语言特定...

airis2014的专栏 286

直击痛点:VS2015离线安装报错“安装包丢失或损坏”的根源分析与精准修复

本文深入剖析了Visual Studio 2015离线安装时出现“安装包丢失或损坏”报错的根本原因,指出问题核心在于安装程序固化的临时路径查找逻辑。文章提供了一步到位的精准修复方案,通过将ISO镜像中的完整packages文件夹复制到安装程序指定的临时路径,即可无需联网、无需操作证书直接解决问题,并对比分析了其他常见方法的局限性。

weixin_27734811的博客 357

SLAM Cartographer(18)后端优化问题求解器

了解经过闭环检测构建了子图与节点之间的约束之后,通过后端优化求解器进行优化求解。核心是基于Ceres库进行SPA(Sparse Pose Adjustment)的优化方法,把后端优化问题描述成为一个最小二乘的问题求解

氢键H-H 5680

java 内存动态编译_java内存动态编译执行

1.package org.jui.core.dynamic;public class DynaCompTest {public static void main(String[] args) throws Exception {String fullName = "DynaClass";StringBuilder src = new StringBuilder();src.append("pub...

weixin_31004409的博客 168

深度学习论文: AnomalyDINO: Boosting Patch-based Few-shot Anomaly Detection with DINOv2

通过将DINOv2模型适应到一次性和少量异常检测中,并专注于工业应用少量异常检测。实验表明,这种方法不仅与现有技术相匹敌,甚至可以在许多设置中超越它们。我们提出的仅视觉方法AnomalyDINO基于补丁相似性,能够实现图像级别的异常预测和像素级别的异常分割。该方法在方法论上很简单,无需训练,因此不需要任何额外的数据进行微调或元学习。

mingo_敏 1904

c#动态编译并执行字符串

比较简单,步骤是这样的 string -> compiler -> assembly -> reflection -> execution 直接上代码: using System; using Microsoft.CSharp; using System.CodeDom.Compiler; class Program { public st...

weixin_30888027的博客 348

论文阅读:Query-Dependent Video Representation for Moment Retrieval and Highlight Detection

近年来,随着视频理解需求的急剧增加,视频时刻检索和高亮检测(MR/HD)成为人们关注的焦点。MR/HD的主要目标是对给定的文本进行视频时刻定位和内容一致性估计,即显著性得分。尽管最近基于transformer的模型带来了一些进步,但我们发现这些方法并不能完全利用给定查询的信息。例如,在预测时刻及其显著性时,有时会忽略文本查询与视频内容之间的相关性。为了解决这个问题,我们引入了基于查询的DETR (QD-DETR),这是一种为MR/HD量身定制的检测transfomer。

qq_42681787的博客 919

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

什么是元编程,.NET有哪些元编程的手段和场景?

它允许在运行时动态获取程序集、类型和成员的信息,并对它们进行操作。通过反射,可以实现动态创建对象、调用方法、获取和设置属性等操作。框架中的一个组件,它提供了对动态语言的支持,并允许在运行时动态执行脚本和调用动态语言中的对象。这些元编程的手段和场景能够在运行时动态地创建、组织和操作代码,从而实现更灵活和动态的应用程序。),它允许在编译时不确定对象类型,而是在运行时根据实际类型进行动态绑定。框架提供了编译器服务,允许在运行时动态编译和执行代码。等命名空间下的类,可以实现动态代码的生成和执行。

一个专注于技术研究创新的程序员 444

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

元编程总结

    1. 元编程(Metaprogramming) 1 2. 元编程的历史and发展 1 3. 元类型and元数据 1 4. 元编程实现方式 2 4.1. 代码生成 2 4.2. lex和yacc分析器 2 4.3. 泛型编程 2 4.4. 注解 2 4.5. 解释型框架 2 4.6. 对象工厂概念,一个会写程序的程序! 3 4.7. Aop 3 4.8. 数据对象...

300

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Elixir代码操作:Code模块的元编程能力

你是否曾经想过,如何在运行时动态编译和执行代码?如何在开发工具中实现智能代码补全?如何构建强大的代码格式化工具?Elixir的Code模块正是解决这些问题的利器,它提供了丰富的元编程(Metaprogramming)能力,让你能够深入操作和操作代码本身。 ## 什么是元编程? 元编程是指编写能够操作其他程序(甚至自身)作为数据的程序。在Elixir中,元编程主要通过操作AST(Abstract...

gitblog_01056的博客 654

AI编译器技术深探:TVM与Triton的算子优化哲学对比

通过构建多层可扩展IR系统(如Affine Dialect、GPU Dialect),MLIR实现了从算法描述到硬件指令的全流程统一表达。现代AI编译器的核心目标是通过计算与调度分离(Separation of Computation and Scheduling)实现算子的极致性能优化。TVM继承了Halide的衣钵,构建了分层编译架构。其Relay中间表示层专注于计算图的全局优化(如算子融合、常量折叠),而TVM层通过调度模板(Schedule Template)实现算子级优化。

AladdinEdu,你的AI学习实践工作坊。让想法落地,让研究加速。助力高校AI人才成长,点亮创新未来。 2648

Elixir元编程-第三章 编译时代码生成技术进阶

Elixir元编程-第三章 编译时代码生成技术进阶 注:本章内容来自 Metaprogramming Elixir 一书,写的非常好,强烈推荐。内容不是原文照翻,部分文字采取意译,主要内容都基本保留,加上自己的一些理解描述。为更好理解,建议参考原文。 基于外部数据源生成函数 Elixir中如何...

chengyou0542的博客 626

探索Python中的元编程动态创建与修改代码的艺术

例如,`type`类是所有类的类(即元类),它本身也是一个可调用的对象,可以用来动态地创建新的类。通过自定义元类并重写其`__new__`或`__init__`方法,我们可以介入类的创建过程,实现对类属性的验证、自动注册、方法注入等高级操作。虽然元类的使用需要谨慎,因为它增加了代码的复杂性,但在需要深度控制类行为的场景下,它是无可替代的强大工具。因此,在实际开发中,应遵循“显式优于隐式”的原则,仅在确实需要时使用元编程,并辅以充分的文档和注释,确保代码的意图清晰明了,以便于团队协作和后期维护。

allrightxiong的博客 273
上一篇: 简单的CodeDOM示例
下一篇: C#中动态编译应用程序
colderboy
博客等级 码龄26年 1粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值