c#动态编译(代码片段)

duanjt duanjt     2022-12-10     456

关键词:

公司需要自己做一个打包程序,将需要升级文件和脚本做成一个exe安装包,双击exe安装包的时候输入相关的参数就执行升级(文件覆盖和脚本执行),大概思路如下:
1.先把exe的逻辑写好,包括提取文件和脚本执行代码
2.exe从资源中提取文件和脚本
3.组包程序将需要升级的脚本和文件加入到exe的资源文件,然后编译成exe。

exe的核心代码如下:

if (!Directory.Exists("myFile"))

    Directory.CreateDirectory("myFile");


//获取资源文件并输出到myFile文件夹
Assembly assm = Assembly.GetExecutingAssembly();
foreach (var item in assm.GetManifestResourceNames())

    Stream stream = assm.GetManifestResourceStream(item);
    byte[] bs = new byte[stream.Length];
    stream.Read(bs, 0, bs.Length);
    File.WriteAllBytes("myFile\\" + item, bs);
    this.textBox1.AppendText("成功提取文件:" + item + "\r\n");

this.textBox1.AppendText("文件保存在:"+AppDomain.CurrentDomain.BaseDirectory+"\\myFile");
string result = string.Join("*", assm.GetManifestResourceNames());
MessageBox.Show("成功," + result);


组包的核心代码如下:

CSharpCodeProvider p = new CSharpCodeProvider();

// 设置编译参数
CompilerParameters options = new CompilerParameters();

//加入引用的程序集
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.Windows.Forms.dll");
options.ReferencedAssemblies.Add("System.Drawing.dll");

options.GenerateExecutable = true;                  //是否生成可执行文件,否则就是内存中
// CompilerOptions 参考地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/compiler-options/addmodule-compiler-option
options.CompilerOptions = "-t:winexe";              //非控制台应用程序
options.CompilerOptions += " -win32icon:index.ico"; //设置图标
options.OutputAssembly = "HelloWorld.exe";          //输出exe的名称
options.MainClass = "TestPackage.Program";          //主运行类

//循环加入资源文件,貌似不支持文件夹,因此多个文件可以自己压缩为zip再加入
foreach (var file in this.listBox1.Items)

    options.EmbeddedResources.Add(file.ToString());


// 开始编译
string[] files = new string[]
    @"..\..\..\TestPackage\Program.cs",
    @"..\..\..\TestPackage\MainForm.cs"
;
CompilerResults cr = p.CompileAssemblyFromFile(options, files);

// 显示编译信息
if (cr.Errors.Count == 0)

    Console.WriteLine("0 compiled ok!", cr.CompiledAssembly.Location);
    MessageBox.Show("成功");

else

    Console.WriteLine("Complie Error:");
    foreach (CompilerError error in cr.Errors)
        Console.WriteLine("  0", error);
    MessageBox.Show("失败");


Console.WriteLine("Press Enter key to exit...");

 

有了核心代码,后面的就可以自己去实现文件的加入和提取了。

c#中的反射(代码片段)

...对象的内部实现二:反射的优缺点首先在编译中分为动态编译和静态编译,静态编译是在编译中 查看详情

roslyn(代码片段)

...器的API,使得开发者可以借助编译器进行解析代码文件、动态为编程语言增加功能、扩展编译器、自定义编译器动作等操作。将Roslyn编译结果保存在流中,用程序集加载方法将流加载到当前程序集中,就可以在当前的程序集中调... 查看详情

程序动态编译代码

c#可以在程序运行过程中动态的编译代码,并生成程序集加载在内存,然后就可以动态的调用代码生成的程序了,这有点像我们的vs编译器,感兴趣的可以制作属于自己的c#编译器:要实现这种功能,我们只需要调用CSharpCodeProvider... 查看详情

c#中的反射(代码片段)

...对象的内部实现二:反射的优缺点首先在编译中分为动态编译和静态编译,静态编译是在编译中确定类型,绑定对象,而动态编译是在运行中确定类型,绑定对象反射的优点就是可以动态创建对象、绑定对象&#... 查看详情

c#动态添加类动态添加类型代码添加类型(代码片段)

原文:C#动态添加类、动态添加类型、代码添加类型引用控件: DLL下载地址:http://pan.baidu.com/s/1nv2GUWL        publicclassTypeCreatorpublicstaticTypeCreator(stringClassName,intPropertiesCo 查看详情

c#多态性学习,虚方法抽象方法接口等用法举例(代码片段)

... 根据网上的教程,我们得知C#多态性分为两类,静态和动态。但实际上,C#没有严格的静态和动态多态性的分法。之所以这么分,还是为了我们便于理解,我们沿用这个思维来大概分类:采用函数重载或运算符重载方法的,属... 查看详情

c#动态编译

我想在c#中通过动态编译实现一个科学计算器器功能,用户直接输入运算表达式即可,如256*56(145+56*254/345).然后通过动态编译返回结果。请给出代码或例子!~比如说:将textbox1的用户输入语句如256*56(145+56*254/345)利用动态... 查看详情

c#基础泛型(代码片段)

...易使用,但性能损失比较大。泛型的话在编译的时候就会动态生成我们定义他的类型,这样就不用进行装箱和拆箱。varlist=newList<int>();上面这一句的话编译的时候就 查看详情

p/invoke之c#调用动态链接库dll(代码片段)

...C#控制台应用右击解决方案,添加一个新建项,新建一个"动态链接库(DLL)",新建完之后需要右击当前项目-->属性-->C/C++-->预编译头-->选择"不使用编译头"在新建的DLL中我们新建一个头文件,用于编写我们的方法定义,... 查看详情

与下位机或设备的通信解析优化的一点功能(续补):动态编译(代码片段)

原文:与下位机或设备的通信解析优化的一点功能(续补):动态编译  继上一篇《与下位机或设备的通信解析优化的一点功能:T4+动态编译》 ,现在已经生成出解析用的类的C#源码了,接下来,就轮到动态编译生成Type了。&... 查看详情

c#动态加载dll文件(代码片段)

///<summary>///动态加载DLL///</summary>///<paramname="lpFileName">DLL路径</param>///<paramname="Namespace">命名空间</param>///<paramname="ClassName">类名</param>/// 查看详情

c#条件编译(#if和conditional)(代码片段)

本文转载自:C#条件编译(#if和Conditional)-腾讯云开发者社区-腾讯云本文主要讲述C#中,使用#if和Conditional特性来按条件编译代码的不同原理和适用场景。本文参考了c#Conditional用法详解和.NET/C#使用#if和Conditional特... 查看详情

c#条件编译(#if和conditional)(代码片段)

本文转载自:C#条件编译(#if和Conditional)-腾讯云开发者社区-腾讯云本文主要讲述C#中,使用#if和Conditional特性来按条件编译代码的不同原理和适用场景。本文参考了c#Conditional用法详解和.NET/C#使用#if和Conditional特... 查看详情

unity中动态加载dll文件(代码片段)

除了简单地在UnityEditor中AddComponent添加C#脚本关联到具体的GameObject外,如果脚本功能相对独立或复杂一点,可将脚本封装成dll文件,unity来调用该dll。DLL,是DynamicLinkLibrary的缩写,Windows平台广泛存在,广泛使用,可以使用C#或C++... 查看详情

c#自定义并动态切换光标(代码片段)

...stem.Windows.Input)|MicrosoftDocs[1]本章介绍如何自定义光标、并动态切换光标类型。动态切换 查看详情

c#动态编译

原文:http://www.cnblogs.com/jailu/archive/2007/07/22/827058.htmlusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Reflection;usingSystem.Globalization;usingMicros 查看详情

unity之c#脚本编译dll(代码片段)

...整,C#代码权限仅主程可见,取而代之的是一个被编译成dll类型的文件。现在终于有空,来研究下C#脚本是如何编译成dll文件并调用C#中的类,方法等。准备首先创建一个DllTest场景。创建一个将被编译成d 查看详情

qt创建动态库给c#调用,通过回调完成交互(代码片段)

...要多种不同的语言混合编程。比如:利用Qt开发一个动态库,给C#调用。当前的需求是:利用Qt开发一个工具库,给C#调用,来完成一些特殊处理。需要Qt生成一个动态库(dll),给C#加载调用,并且还需要... 查看详情