美文网首页技术干货程序员
CodeDOM 动态编译使用以及c# dll动态链接库生成

CodeDOM 动态编译使用以及c# dll动态链接库生成

作者: 咖啡机an | 来源:发表于2017-09-04 23:29 被阅读0次

    该动态编译可以生成一个DTO类

    1.创建一个控制台项目

    1.png

    2.新建一个c#类,一个Dto类

    using System.CodeDom;
    using System.CodeDom.Compiler;
    using System.Reflection;
    using System.Collections.Generic;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                IList<ParameterDto> parameters = new List<ParameterDto>();
                parameters.Add(new ParameterDto(1, "强制条件", "#MandatoryConditions", 4));
                parameters.Add(new ParameterDto(2, "请假天数", "#LeaveDays", 1));
                parameters.Add(new ParameterDto(3, "请假原因", "#LeaveReason", 2));
                parameters.Add(new ParameterDto(4, "返校日期", "#RetuenDate", 3));
                parameters.Add(new ParameterDto(5, "审核签字", "#SignName", 2));
                int result =  CodeDomParameter(parameters);
            }
    
            //CodeDOM 动态编译实体类
                //CodeDOM 动态编译实体类
            public static int CodeDomParameter(IList<WParameterDto> parameters)
            {
                int result = 0;
    
                //准备一个代码编译器单元
                CodeCompileUnit unit = new CodeCompileUnit();
                //准备必要的命名空间(这个是指要生成的类的空间)
                CodeNamespace sampleNamespace = new CodeNamespace("WFlow.DTOs");
                //导入必要的命名空间
                sampleNamespace.Imports.Add(new CodeNamespaceImport("System"));
                //准备要生成的类的定义
                CodeTypeDeclaration Customerclass = new CodeTypeDeclaration("InputParameterDto");
                //指定这是一个Class
                Customerclass.IsClass = true;
                Customerclass.TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
                //把这个类放在这个命名空间下
                sampleNamespace.Types.Add(Customerclass);
                //把该命名空间加入到编译器单元的命名空间集合中
                unit.Namespaces.Add(sampleNamespace);
                //这是输出文件
                string outputFile = "D:\\Vs\\Workflow\\Workflow\\DTOs\\InputParameterDto.cs";
    
                //参数数据类型,1 - 数值型 2 - 字符串类型 3 - 时间日期 4 - 布尔型
    
                CodeMemberField field = null;
                foreach (WParameterDto parameter in parameters)
                {
                    //添加字段
                    string paremeterCode ="_"+ parameter.parameterCode.Substring(1);
                    //赋值的字段
                    string parameterCodeP = parameter.parameterCode.Substring(1);
                    switch (parameter.parameterType)
                    {
                        case 1:
                            field = new CodeMemberField(typeof(int), paremeterCode);
                            break;
                        case 2:
                            field = new CodeMemberField(typeof(string), paremeterCode);
                            break;
                        case 3:
                            field = new CodeMemberField(typeof(string), paremeterCode);
                            break;
                        case 4:
                            field = new CodeMemberField(typeof(bool), paremeterCode);
                            break;
                        default:
                            break;
                    }
    
                    field.Attributes = MemberAttributes.Private;
                    field.Comments.Add(new CodeCommentStatement(parameter.parameterName));
                    Customerclass.Members.Add(field);
                    //添加属性
                    CodeMemberProperty property = new CodeMemberProperty();
                    property.Attributes = MemberAttributes.Public | MemberAttributes.Final;
                    property.Name = parameterCodeP;
                    property.HasGet = true;
                    property.HasSet = true;
                    property.Type = null;
                    //参数数据类型,1 - 数值型 2 - 字符串类型 3 - 时间日期 4 - 布尔型
                    switch (parameter.parameterType)
                    {
                        case 1:
                            property.Type = new CodeTypeReference(typeof(int));
                            break;
                        case 2:
                            property.Type = new CodeTypeReference(typeof(string));
                            break;
                        case 3:
                            property.Type = new CodeTypeReference(typeof(string));
                            break;
                        case 4:
                            property.Type = new CodeTypeReference(typeof(bool));
                            break;
                        default:
                            break;
                    }
                    property.Comments.Add(new CodeCommentStatement(parameter.parameterName));
                    property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), paremeterCode)));
                    property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), paremeterCode), new CodePropertySetValueReferenceExpression()));
                    Customerclass.Members.Add(property);
                }
    
                //添加方法(使用CodeMemberMethod)--此处略
                //添加构造器(使用CodeConstructor) --此处略
                //添加程序入口点(使用CodeEntryPointMethod) --此处略
                //添加事件(使用CodeMemberEvent) --此处略
                //添加特征(使用 CodeAttributeDeclaration)
                Customerclass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(SerializableAttribute))));
    
                //生成代码
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                CodeGeneratorOptions options = new CodeGeneratorOptions();
                options.BracingStyle = "C";
                options.BlankLinesBetweenMembers = true;
    
    
                using (System.IO.StreamWriter sw = new System.IO.StreamWriter(outputFile))
                {
                    //if (File.Exists(@outputFile)) {
                    //    File.Delete(@outputFile);
                    //}
                    provider.GenerateCodeFromCompileUnit(unit, sw, options);
                    result = 1;
                }
    
                //string sourceFile = @"InputParameterDto.cs";
                //string destinationFile = @"../../DTOs/InputParameterDto.cs";
                //FileInfo file = new FileInfo(sourceFile);
                //if (file.Exists)
                //{
                //    // true is overwrite
                //    file.CopyTo(destinationFile, true);
                //}
                return result;
            }
       }
    }
    
    namespace ConsoleApplication1
    {
        internal class ParameterDto
        {
            private int parameterId;
            private string parameterName;
            private string parameterCode;
            private int parameterType;
    
            public int ParameterId
            {
                get
                {
                    return parameterId;
                }
    
                set
                {
                    parameterId = value;
                }
            }
    
            public string ParameterName
            {
                get
                {
                    return parameterName;
                }
    
                set
                {
                    parameterName = value;
                }
            }
    
            public string ParameterCode
            {
                get
                {
                    return parameterCode;
                }
    
                set
                {
                    parameterCode = value;
                }
            }
    
            public int ParameterType
            {
                get
                {
                    return parameterType;
                }
    
                set
                {
                    parameterType = value;
                }
            }
    
            public ParameterDto(int parameterId, string parameterName, string parameterCode, int parameterType)
            {
                this.ParameterId = parameterId;
                this.ParameterName = parameterName;
                this.ParameterCode = parameterCode;
                this.ParameterType = parameterType;
            }
    
    
        }
    }
    

    3.运行控制台项目

    2.png

    运行后得到一个类,该类的位置默认位于该项目文件夹中

    6.png
    //------------------------------------------------------------------------------
    // <auto-generated>
    //     此代码由工具生成。
    //     运行时版本:4.0.30319.42000
    //
    //     对此文件的更改可能会导致不正确的行为,并且如果
    //     重新生成代码,这些更改将会丢失。
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace Workflow.DTOs
    {
        using System;
        
        
        public class ParameterDto
        {
            
            // 强制条件
            private bool MandatoryConditions;
            
            // 请假天数
            private int LeaveDays;
            
            // 请假原因
            private string LeaveReason;
            
            // 返校日期
            private string RetuenDate;
            
            // 审核签字
            private string SignName;
            
            public bool MandatoryConditions
            {
                get
                {
                    return this.MandatoryConditions;
                }
                set
                {
                    this.MandatoryConditions = value;
                }
            }
            
            public int LeaveDays
            {
                get
                {
                    return this.LeaveDays;
                }
                set
                {
                    this.LeaveDays = value;
                }
            }
            
            public string LeaveReason
            {
                get
                {
                    return this.LeaveReason;
                }
                set
                {
                    this.LeaveReason = value;
                }
            }
            
            public string RetuenDate
            {
                get
                {
                    return this.RetuenDate;
                }
                set
                {
                    this.RetuenDate = value;
                }
            }
            
            public string SignName
            {
                get
                {
                    return this.SignName;
                }
                set
                {
                    this.SignName = value;
                }
            }
        }
    }
    
    

    4.生成dll

    1. 打开项目,选择属性,ctrl+s保存设置。
      2.点击生成,选择重新生成解决方案
      3.dll文件位于


      6.png
    3.png 4.png 5}L.png

    相关文章

      网友评论

        本文标题:CodeDOM 动态编译使用以及c# dll动态链接库生成

        本文链接:https://www.haomeiwen.com/subject/qzyyjxtx.html