手机版

C#动态编译、动态执行、动态调试

时间:2021-10-26 来源:互联网 编辑:宝哥软件园 浏览:

在此基础上,我做了一些封装,为了让调用更容易,增加了对动态代码调试的支持,对同一代码只编译一次的支持,对代码变化的自动重新编译,代码引用文件的自动加载和手动加载等。如上所示,我封装的类CSharpProvider非常简单。下面我们来解释一下一些公众成员的用法。公共程序集文件名:此属性指定动态编译后生成的程序集的名称。CompilerParameters:此属性指定已编译的参数References:此属性指定已编译代码中的引用。调用方只能通过调用references来添加自己的引用。添加(' xxx.dll ')。对于系统命名空间中的所有引用,不需要手动添加它们,类将被自动加载。对于用户自己的组件,如果没有手动指定引用文件,类将根据命名空间名称自动猜测。SourceCodeFileEncoding:如果编译为文件,请指定文件的编码类型。公共bool Compile(字符串代码)方法输入代码字符串。并编译public bool compile from file(字符串源代码文件名)和编译输入代码文件public object create instance(字符串代码,字符串类型全名)来创建类的一个实例,如下面的代码所示。您可以输入create instance(代码,' myinterface.ihello world ')或create instance(代码,' hello world '),程序会自动找到合格的类,并根据类型名实例化它们。如果代码中有多个指定类型的类,第一个类将被实例化。复制代码如下:使用系统;使用MyInterface[Serializable]公共类hello world : marshalbyref object,ihello world { public string Say(){ return ' Hi ';}}这里需要指出的是,由于AppDomain的远程调用,所有动态加载的代码都必须从MarshallByRefObject继承。如果只声明为[Serializable],可以执行,但是主应用域会记录一个子应用域的引用,导致子应用域卸载后内存泄漏。所以这是至关重要的,所以我们必须重视。公共创建实例文件(字符串文件名,字符串类型全名)从文件创建一个动态实例让我们来谈谈调试动态代码。如果动态创建的代码无法调试,就会像黑盒一样,极大地破坏系统的可维护性。为了将来实现这个功能,我们需要做以下工作。首先,我们需要在编译时生成调试信息,这可以通过设置compilerparameters来实现。includedebugininformation=true;其次,我们必须告诉调试器源代码的相应位置。如果从文件编译,源代码文件的位置将自动写入调试信息文件*。pdb,而在内存编译的情况下,我还没有找到指定的方法。如果有朋友知道的话,还是希望给大家一些建议。目前要调试动态代码,必须从文件编译,即从文件调用编译,创建instancefromfile。第三,我们需要在代码中设置一个断点,这样可以增加系统。diagnostics.debugger.break()到代码。去解决。如下图所示,现在可以调试动态代码了。

应用域为了避免内存泄漏,这个程序封装了应用域的使用,调用者基本不需要关心应用域的调用和卸载过程。当程序被重新编译或销毁时,它会自动卸载应用程序域,从而释放内存。既然做这个程序在应用领域遇到了很多麻烦,我觉得有必要简单说说应用领域。

如上图所示,应用程序实际上有点像一个单独的进程,但是这个进程正在当前进程中运行。当然,这个比喻不够恰当。调用应用程序域有点类似于进程间远程处理方式的对象调用,也就是说,默认应用程序域必须通过远程调用而不是直接调用来调用其他应用程序域中的对象。如果直接调用,默认的应用域会记录一个被调用应用域的内存引用,即使用unload方法卸载应用域后,内存也无法释放,这是我开始操作应用域时遇到的最大麻烦。此外,两个应用程序域之间公开的所有类都必须基于MarshalByRefObject,这一点非常重要,否则将不会释放内存。这个程序的一些缺陷。没有用于编译多个文件的接口。其实认识到这一点很简单。考虑到用于动态执行的代码脚本通常很简单,它们很懒并且没有完成。2.动态代码中没有多个对象的枚举接口,我们可以在后面改进。源代码下载地址http://xiazai.jb51.net/200905/yuanma/DynamiclyCompiler.zip.

版权声明:C#动态编译、动态执行、动态调试是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。