CodeDOM 動(dòng)態(tài)編譯使用以及c# dll動(dòng)態(tài)鏈接庫(kù)生成

該動(dòng)態(tài)編譯可以生成一個(gè)DTO類

1.創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目

1.png

2.新建一個(gè)c#類,一個(gè)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, "強(qiáng)制條件", "#MandatoryConditions", 4));
            parameters.Add(new ParameterDto(2, "請(qǐng)假天數(shù)", "#LeaveDays", 1));
            parameters.Add(new ParameterDto(3, "請(qǐng)假原因", "#LeaveReason", 2));
            parameters.Add(new ParameterDto(4, "返校日期", "#RetuenDate", 3));
            parameters.Add(new ParameterDto(5, "審核簽字", "#SignName", 2));
            int result =  CodeDomParameter(parameters);
        }

        //CodeDOM 動(dòng)態(tài)編譯實(shí)體類
            //CodeDOM 動(dòng)態(tài)編譯實(shí)體類
        public static int CodeDomParameter(IList<WParameterDto> parameters)
        {
            int result = 0;

            //準(zhǔn)備一個(gè)代碼編譯器單元
            CodeCompileUnit unit = new CodeCompileUnit();
            //準(zhǔn)備必要的命名空間(這個(gè)是指要生成的類的空間)
            CodeNamespace sampleNamespace = new CodeNamespace("WFlow.DTOs");
            //導(dǎo)入必要的命名空間
            sampleNamespace.Imports.Add(new CodeNamespaceImport("System"));
            //準(zhǔn)備要生成的類的定義
            CodeTypeDeclaration Customerclass = new CodeTypeDeclaration("InputParameterDto");
            //指定這是一個(gè)Class
            Customerclass.IsClass = true;
            Customerclass.TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;
            //把這個(gè)類放在這個(gè)命名空間下
            sampleNamespace.Types.Add(Customerclass);
            //把該命名空間加入到編譯器單元的命名空間集合中
            unit.Namespaces.Add(sampleNamespace);
            //這是輸出文件
            string outputFile = "D:\\Vs\\Workflow\\Workflow\\DTOs\\InputParameterDto.cs";

            //參數(shù)數(shù)據(jù)類型滥比,1 - 數(shù)值型 2 - 字符串類型 3 - 時(shí)間日期 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;
                //參數(shù)數(shù)據(jù)類型九府,1 - 數(shù)值型 2 - 字符串類型 3 - 時(shí)間日期 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)--此處略
            //添加構(gòu)造器(使用CodeConstructor) --此處略
            //添加程序入口點(diǎn)(使用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.運(yùn)行控制臺(tái)項(xiàng)目

2.png

運(yùn)行后得到一個(gè)類甩栈,該類的位置默認(rèn)位于該項(xiàng)目文件夾中

6.png
//------------------------------------------------------------------------------
// <auto-generated>
//     此代碼由工具生成臊旭。
//     運(yùn)行時(shí)版本:4.0.30319.42000
//
//     對(duì)此文件的更改可能會(huì)導(dǎo)致不正確的行為,并且如果
//     重新生成代碼撒顿,這些更改將會(huì)丟失。
// </auto-generated>
//------------------------------------------------------------------------------

namespace Workflow.DTOs
{
    using System;
    
    
    public class ParameterDto
    {
        
        // 強(qiáng)制條件
        private bool MandatoryConditions;
        
        // 請(qǐng)假天數(shù)
        private int LeaveDays;
        
        // 請(qǐng)假原因
        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. 打開(kāi)項(xiàng)目荚板,選擇屬性,ctrl+s保存設(shè)置凤壁。
    2.點(diǎn)擊生成,選擇重新生成解決方案
    3.dll文件位于


    6.png
3.png
4.png
5}L.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跪另,一起剝皮案震驚了整個(gè)濱河市拧抖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌免绿,老刑警劉巖唧席,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡淌哟,警方通過(guò)查閱死者的電腦和手機(jī)迹卢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)徒仓,“玉大人婶希,你說(shuō)我怎么就攤上這事∨詈猓” “怎么了喻杈?”我有些...
    開(kāi)封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狰晚。 經(jīng)常有香客問(wèn)我筒饰,道長(zhǎng),這世上最難降的妖魔是什么壁晒? 我笑而不...
    開(kāi)封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任瓷们,我火速辦了婚禮,結(jié)果婚禮上秒咐,老公的妹妹穿的比我還像新娘谬晕。我一直安慰自己,他們只是感情好携取,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布攒钳。 她就那樣靜靜地躺著,像睡著了一般雷滋。 火紅的嫁衣襯著肌膚如雪不撑。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天晤斩,我揣著相機(jī)與錄音焕檬,去河邊找鬼。 笑死澳泵,一個(gè)胖子當(dāng)著我的面吹牛实愚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兔辅,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腊敲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了幢妄?” 一聲冷哼從身側(cè)響起兔仰,我...
    開(kāi)封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茫负,失蹤者是張志新(化名)和其女友劉穎蕉鸳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮尝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年榕吼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片勉失。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羹蚣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乱凿,到底是詐尸還是另有隱情顽素,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布徒蟆,位于F島的核電站胁出,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏段审。R本人自食惡果不足惜全蝶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寺枉。 院中可真熱鬧抑淫,春花似錦、人聲如沸姥闪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筐喳。三九已至埂蕊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疏唾,已是汗流浹背蓄氧。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留槐脏,地道東北人喉童。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像顿天,于是被迫代替她去往敵國(guó)和親堂氯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 動(dòng)態(tài)調(diào)用動(dòng)態(tài)庫(kù)方法c/c++linuxwindows 關(guān)于動(dòng)態(tài)調(diào)用動(dòng)態(tài)庫(kù)方法說(shuō)明 一牌废、 動(dòng)態(tài)庫(kù)概述 1咽白、 動(dòng)態(tài)庫(kù)的...
    KINGZ1993閱讀 13,894評(píng)論 0 10
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)鸟缕,斷路器晶框,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 一排抬、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問(wèn)題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,784評(píng)論 0 27
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,838評(píng)論 25 707
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評(píng)論 6 342