韦德国际1946英国 > 计算机网络 > 在线运行,动态编译

原标题:在线运行,动态编译

浏览次数:82 时间:2019-05-02

 

计算机网络 1using System;
计算机网络 2using System.Drawing;
计算机网络 3using System.Collections;
计算机网络 4using System.ComponentModel;
计算机网络 5using System.Windows.Forms;
计算机网络 6using System.Data;
计算机网络 7using Microsoft.Web.Services2;
计算机网络 8using Microsoft.Web.Services2.Security;
计算机网络 9using Microsoft.Web.Services2.Security.Tokens;
计算机网络 10using GDS.Ldap;
计算机网络 11using System.Text;
计算机网络 12
计算机网络 13namespace WSEClientTest
计算机网络 14计算机网络 15计算机网络 16{
计算机网络 17计算机网络 18    /**//// <summary>
计算机网络 19    /// Form1 的摘要表达。
计算机网络 20    /// </summary>
计算机网络 21    public class Form1 : System.Windows.Forms.Form
计算机网络 22计算机网络 23    计算机网络 24{
计算机网络 25        private System.Windows.Forms.Button button1;
计算机网络 26        
计算机网络 27计算机网络 28        /**//// <summary>
计算机网络 29        /// 必需的设计器变量。
计算机网络 30        /// </summary>
计算机网络 31        private System.ComponentModel.Container components = null;
计算机网络 32
计算机网络 33        public Form1()
计算机网络 34计算机网络 35        计算机网络 36{
计算机网络 37            //
计算机网络 38            // Windows 窗体设计器扶助所必需的
计算机网络 39            //
计算机网络 40            InitializeComponent();
计算机网络 41
计算机网络 42            //
计算机网络 43            // TODO: 在 InitializeComponent 调用后增多任何构造函数代码
计算机网络 44            //
计算机网络 45        }
计算机网络 46
计算机网络 47计算机网络 48        /**//// <summary>
计算机网络 49        /// 清理全部正在选取的财富。
计算机网络 50        /// </summary>
计算机网络 51        protected override void Dispose( bool disposing )
计算机网络 52计算机网络 53        计算机网络 54{
计算机网络 55            if( disposing )
计算机网络 56计算机网络 57            计算机网络 58{
计算机网络 59                if (components != null) 
计算机网络 60计算机网络 61                计算机网络 62{
计算机网络 63                    components.Dispose();
计算机网络 64                }
计算机网络 65            }
计算机网络 66            base.Dispose( disposing );
计算机网络 67        }
计算机网络 68
计算机网络 69计算机网络 70        Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
计算机网络 71计算机网络 72        /**//// <summary>
计算机网络 73        /// 设计器援助所需的办法 - 不要使用代码编辑器修改
计算机网络 74        /// 此办法的内容。
计算机网络 75        /// </summary>
计算机网络 76        private void InitializeComponent()
计算机网络 77计算机网络 78        计算机网络 79{
计算机网络 80            this.button1 = new System.Windows.Forms.Button();
计算机网络 81            
计算机网络 82            this.SuspendLayout();
计算机网络 83            // 
计算机网络 84            // button1
计算机网络 85            // 
计算机网络 86            this.button1.Location = new System.Drawing.Point(32, 32);
计算机网络 87            this.button1.Name = "button1";
计算机网络 88            this.button1.TabIndex = 0;
计算机网络 89            this.button1.Text = "button1";
计算机网络 90            this.button1.Click  = new System.EventHandler(this.button1_Click);
计算机网络 91        
计算机网络 92            // 
计算机网络 93            // Form1
计算机网络 94            // 
计算机网络 95            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
计算机网络 96            this.ClientSize = new System.Drawing.Size(456, 325);            
计算机网络 97            this.Controls.Add(this.button1);
计算机网络 98            this.Name = "Form1";
计算机网络 99            this.Text = "Form1";
计算机网络 100            this.ResumeLayout(false);
计算机网络 101
计算机网络 102        }
计算机网络 103        #endregion
计算机网络 104
计算机网络 105计算机网络 106        /**//// <summary>
计算机网络 107        /// 应用程序的主入口点。
计算机网络 108        /// </summary>
计算机网络 109        [STAThread]
计算机网络 110        static void Main() 
计算机网络 111计算机网络 112        计算机网络 113{
计算机网络 114            Application.Run(new Form1());
计算机网络 115        }
计算机网络 116
计算机网络 117        private void button1_Click(object sender, System.EventArgs e)
计算机网络 118计算机网络 119        计算机网络 120{
计算机网络 121            UsernameToken token=new UsernameToken("username","password1",PasswordOption.SendPlainText);
计算机网络 122            try
计算机网络 123计算机网络 124            计算机网络 125{
计算机网络 126                localhost.SumServiceWse serviceProxy=new localhost.SumServiceWse();
计算机网络 127                SoapContext requestContext=serviceProxy.RequestSoapContext;
计算机网络 128                requestContext.Security.Timestamp.TtlInSeconds=60;
计算机网络 129                requestContext.Security.Tokens.Add(token);
计算机网络 130                
计算机网络 131                requestContext.Security.Elements.Add(new MessageSignature(token));
计算机网络 132                
计算机网络 133                int sum=serviceProxy.IntAdd(3,5);
计算机网络 134                MessageBox.Show(sum.ToString());
计算机网络 135
计算机网络 136            }
计算机网络 137            catch (System.Web.Services.Protocols.SoapException se) 
计算机网络 138计算机网络 139            计算机网络 140{
计算机网络 141                MessageBox.Show(se.ToString());
计算机网络 142            }
计算机网络 143            catch (Exception ex) 
计算机网络 144计算机网络 145            计算机网络 146{
计算机网络 147                MessageBox.Show(ex.ToString());
计算机网络 148                return;
计算机网络 149            }
计算机网络 150        
计算机网络 151        }
计算机网络 152
计算机网络 153    
计算机网络 154        }
计算机网络 155    }
计算机网络 156
计算机网络 157
计算机网络 158

  今后也触及一下动态编写翻译吧!二〇一八年也闻讯过了,不过只瞄了壹眼,没去试行,不久前有同事在介绍动态编写翻译,那时小编因为有个别原因无法去听取。以后就看一下

 

4、试验的.net客户端代码

 1        public static void TestMain()
 2         {
 3             _default = new CompilTest();
 4             _default.SimpleCompile(code);
 5         }
 6 
 7        static CompilTest _default;
 8 
 9 
10         CodeDomProvider compiler;
11         CompilerParameters comPara;
12         const string code=@"using System;
13 
14 class Test
15 {
16 static void Main()
17 {
18 Console.WriteLine(""Hello world"");
19 Console.ReadLine();
20 }
21 }";
22 
23         private CompilTest()
24         {
25             compiler = new CSharpCodeProvider();
26             comPara = new CompilerParameters();
27         }
28 
29 
30 
31         public void SimpleCompile(string code)
32         {
33             comPara.GenerateExecutable = true;
34             comPara.GenerateInMemory = false;
35             comPara.OutputAssembly = "SimpleCompile.exe";
36 
37             compiler.CompileAssemblyFromSource(comPara, code);
38         }

运转示例

计算机网络 159/*
计算机网络 160 *在线运行,动态编译。 Created on 2005-2-26
计算机网络 161 *
计算机网络 162 * TODO To change the template for this generated file go to
计算机网络 163 * Window - Preferences - Java - Code Style - Code Templates
计算机网络 164 */
计算机网络 165package WSEClient;
计算机网络 166
计算机网络 167import net.vitale.filippo.axis.handlers.*;
计算机网络 168import org.apache.axis.client.*;
计算机网络 169import javax.xml.namespace.*;
计算机网络 170
计算机网络 171/**
计算机网络 172 * @author Jeet
计算机网络 173 *
计算机网络 174 * TODO To change the template for this generated type comment go to
计算机网络 175 * Window - Preferences - Java - Code Style - Code Templates
计算机网络 176 */
计算机网络 177public class TestService
计算机网络 178{
计算机网络 179
计算机网络 180    static String usernameS = null; 
计算机网络 181    static String passwordS = null; 
计算机网络 182
计算机网络 183    public static void main(String[] args)
计算机网络 184    {
计算机网络 185        try { 
计算机网络 186            Integer i = new Integer(5); 
计算机网络 187            Integer j = new Integer(2); 
计算机网络 188            String endpoint=""; 
计算机网络 189            Service service = new Service(); 
计算机网络 190            Call call = (Call)service.createCall(); 
计算机网络 191            call.setTargetEndpointAddress(new java.net.URL(endpoint)); 
计算机网络 192            call.setOperationName(new QName("")); 
计算机网络 193            call.addParameter("a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN); 
计算机网络 194            call.addParameter("b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN); 
计算机网络 195            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT); 
计算机网络 196//            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
计算机网络 197计算机网络,            call.setUseSOAPAction(true); 
计算机网络 198            call.setSOAPActionURI(""); 
计算机网络 199            //add a user token 
计算机网络 200            usernameS="1234";
计算机网络 201            passwordS = "password"; 
计算机网络 202            call.setUsername(usernameS); 
计算机网络 203            call.setPassword(passwordS); 
计算机网络 204    
计算机网络 205            call.setProperty(WsseClientHandler.PASSWORD_OPTION, WsseClientHandler.PASSWORD_DIGEST_WITH_NONCE); 
计算机网络 206            call.setClientHandlers(new WsseClientHandler(), null); 
计算机网络 207            Integer k = (Integer)call.invoke(new Object[]{i,j}); 
计算机网络 208            System.out.println( "result is "   k.toString()   "."); 
计算机网络 209//            Vector inputs = new Vector();
计算机网络 210//            String s=(String)call.invoke(inputs.toArray());
计算机网络 211//            System.out.println("result is " s  ".");
计算机网络 212                  
计算机网络 213           } 
计算机网络 214           catch (org.apache.axis.AxisFault e) 
计算机网络 215           { 
计算机网络 216            if (e.getFaultCode().toString() .equals("{")) 
计算机网络 217             System.err.println("The usernameToken and password aren't right! "); 
计算机网络 218            else { 
计算机网络 219                   System.err.println(e.getFaultCode().toString()); 
计算机网络 220            } 
计算机网络 221           } 
计算机网络 222           catch(Exception e) 
计算机网络 223           { 
计算机网络 224            System.err.println(e.toString()) ; 
计算机网络 225           } 
计算机网络 226          } 
计算机网络 227      } 
计算机网络 228
计算机网络 229
计算机网络 230

  整个编写翻译进度最主题用到多少个类CodeDomProvider类和CompilerParameters 类。前者就充当八个编写翻译器,后者则是用于记录传递给编写翻译器的一些参数。在最初学习C#的施用,鄙人未有用得上VS,只可以靠CSC,那么CSC就就像是于CodeDomProvider这几个类,而CSC本人会有这几个命令参数,CompilerParameters 类就可以为CSC传递一些编写翻译音信(生成类型,引用程序集等)。那么上边则尝试用最简易的点子看看这几个动态编写翻译。

 

伍、JAVA的客户端代码,使用axis-wsse(可从http://sourceforge.net/projects/axis-wsse/得到)

计算机网络 231

设置编写翻译参数GenerateInMemory:是或不是在内部存款和储蓄器运营,True - memory generation, false - external file generation。

计算机网络 232using System;
计算机网络 233using Microsoft.Web.Services2;
计算机网络 234using Microsoft.Web.Services2.Security;
计算机网络 235using Microsoft.Web.Services2.Security.Tokens;
计算机网络 236using System.Security;
计算机网络 237using System.Security.Permissions;
计算机网络 238
计算机网络 239namespace WebTest
计算机网络 240计算机网络 241计算机网络 242{
计算机网络 243计算机网络 244    /**//// <summary>
计算机网络 245    /// CustomUsernameTokenManager 的摘要表达。
计算机网络 246    /// </summary>
计算机网络 247    [SecurityPermission(SecurityAction.Demand,
计算机网络 248         Flags= SecurityPermissionFlag.UnmanagedCode)]
计算机网络 249
计算机网络 250    public class CustomUsernameTokenManager:UsernameTokenManager
计算机网络 251计算机网络 252    计算机网络 253{
计算机网络 254        public CustomUsernameTokenManager()
计算机网络 255计算机网络 256        计算机网络 257{
计算机网络 258            //
计算机网络 259            // TODO: 在这边添加构造函数逻辑
计算机网络 260            //
计算机网络 261        }
计算机网络 262
计算机网络 263        protected override string AuthenticateToken(UsernameToken token)
计算机网络 264计算机网络 265        计算机网络 266{
计算机网络 267            if(token==null)
计算机网络 268                throw new ArgumentNullException();
计算机网络 269            if(token.Username=="username")
计算机网络 270                return "password";
计算机网络 271            else
计算机网络 272                return "love";
计算机网络 273            
计算机网络 274//                byte[] encodedUsername=System.Text.Encoding.UTF8.GetBytes(token.Username);
计算机网络 275//                if(System.Text.Encoding.UTF8.GetString(encodedUsername)=="username")
计算机网络 276//                    return "password";
计算机网络 277//            else
计算机网络 278//                    return "love";
计算机网络 279
计算机网络 280        }
计算机网络 281
计算机网络 282    }
计算机网络 283}
计算机网络 284

 

var sw = new StringWriter();
                Console.SetOut(sw);
                Console.SetError(sw);

计算机网络 285<?xml version="1.0" encoding="utf-8"?>
计算机网络 286<configuration>
计算机网络 287  <configSections>
计算机网络 288    <section name="microsoft.web.services2" type="Microsoft.Web.Services2.Configuration.WebServicesConfiguration, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
计算机网络 289  </configSections>
计算机网络 290  <system.web>
计算机网络 291    <webServices>
计算机网络 292      <protocols>
计算机网络 293        <remove name="HttpGet" />
计算机网络 294        <remove name="HttpPost" />
计算机网络 295      </protocols>
计算机网络 296      <soapExtensionTypes>
计算机网络 297        <add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />
计算机网络 298      </soapExtensionTypes>
计算机网络 299    </webServices>
计算机网络 300    <!--  动态调节和测试编写翻译
计算机网络 301          设置 compilation debug="true" 以启用 ASPX 调节和测试。不然,将此值设置为
计算机网络 302          false 将增加此应用程序的运营时品质。
计算机网络 303          设置 compilation debug="true" 以将调节和测试符号(.pdb 消息)
计算机网络 304          插入到编写翻译页中。因为那将创造实践起来
计算机网络 305          比较慢的大文件,所以应该只在调治时将此值设置为 true,而在富有别的时候都设置为
计算机网络 306          false。有关越来越多音讯,请参见有关
计算机网络 307          调节和测试 ASP.NET 文件的文书档案。
计算机网络 308    -->
计算机网络 309    <compilation defaultLanguage="c#" debug="true" />
计算机网络 310    <!--  自定义错误新闻
计算机网络 311          设置 customErrors mode="On" 或 "RemoteOnly" 以启用自定义错误音信,或设置为 "Off" 以禁止使用自定义错误音讯。 
计算机网络 312          为每一种要管理的谬误增多 <error> 标志。
计算机网络 313
计算机网络 314          "On" 始终突显自定义(友好的)音讯。
计算机网络 315          "Off" 始终显示详细的 ASP.NET 错误音信。
计算机网络 316          "RemoteOnly" 只对不在本地 Web 服务器上运维的
计算机网络 317           用户突显自定义(友好的)新闻。出于安全目标,提议使用此设置,以便 
计算机网络 318           不向远程客户端体现应用程序的详细新闻。
计算机网络 319    -->
计算机网络 320    <customErrors mode="RemoteOnly" />
计算机网络 321    <identity impersonate="true" />
计算机网络 322    <!--  身份验证 
计算机网络 323          此节设置应用程序的身份验证战术。可能的模式是 "Windows"、 
计算机网络 324          "Forms"、 "Passport" 和 "None"
计算机网络 325
计算机网络 326          "None" 不实践身份验证。 
计算机网络 327          "Windows" IIS 依照管用程序的装置实行身份验证 
计算机网络 328            (基本、简要或合并 Windows)。在 IIS 中必须禁止使用佚名访问。
计算机网络 329          "Forms" 您为用户提供二个输入凭据的自定义窗体(Web 页),然后 
计算机网络 330           在您的应用程序中验证他们的身价。用户凭据标志存款和储蓄在 Cookie 中。
计算机网络 331          "Passport" 身份验证是透过 Microsoft 的汇总身份验证服务实践的,
计算机网络 332           它为成员站点提供单身登六和骨干配置文件服务。
计算机网络 333    -->
计算机网络 334    <authentication mode="Windows" />
计算机网络 335    <!--  授权 
计算机网络 336           此节设置应用程序的授权战略。能够允许或拒绝差异的用户或剧中人物访问
计算机网络 337          应用程序财富。通配符: "*" 表示任什么人,"?" 表示无名
计算机网络 338          (未经身份验证的)用户。
计算机网络 339    -->
计算机网络 340    <authorization>
计算机网络 341      <allow users="*" />
计算机网络 342      <!-- 允许具有用户 -->
计算机网络 343      <!--  <allow     users="[逗号分隔的用户列表]"
计算机网络 344                             roles="[逗号分隔的剧中人物列表]"/>
计算机网络 345                  <deny      users="[逗号分隔的用户列表]"
计算机网络 346                             roles="[逗号分隔的剧中人物列表]"/>
计算机网络 347            -->
计算机网络 348    </authorization>
计算机网络 349    <!--  应用程序等级跟踪记录
计算机网络 350          应用程序品级跟踪为应用程序中的每一页启用追踪日志输出。
计算机网络 351          设置 trace enabled="true" 能够启用应用程序跟踪记录。假设 pageOutput="true",则
计算机网络 352          在每1页的平底呈现追踪消息。不然,能够通过浏览 Web 应用程序
计算机网络 353           根目录中的 "trace.axd" 页来查看
计算机网络 354          应用程序追踪日志。
计算机网络 355    -->
计算机网络 356    <trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />
计算机网络 357    <!--  会话状态设置
计算机网络 358          私下认可意况下,ASP.NET 使用 Cookie 来标志哪些请求属于特定的对话。
计算机网络 359          假若 Cookie 不可用,则能够透过将会话标志符增多到 UEscortL 来追踪会话。
计算机网络 360         若要禁用 Cookie,请设置 sessionState cookieless="true"。
计算机网络 361    -->
计算机网络 362    <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
计算机网络 363    <!--  全球化
计算机网络 364          此节设置应用程序的全世界化设置。
计算机网络 365    -->
计算机网络 366    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
计算机网络 367  </system.web>
计算机网络 368  <microsoft.web.services2>
计算机网络 369    <diagnostics>
计算机网络 370      <trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
计算机网络 371      <detailedErrors enabled="false" />
计算机网络 372    </diagnostics>
计算机网络 373    <security>
计算机网络 374        <securityTokenManager type="WebTest.CustomUsernameTokenManager,WebTest" xmlns:wsse="" qname="wsse:UsernameToken" />
计算机网络 375    </security>
计算机网络 376  </microsoft.web.services2>
计算机网络 377</configuration>

  那篇也是滋养不多,不上海博物馆客园首页了。

找到代码中的Main方法,并运维(CompiledMethod.Invoke(null, null);)

在帮客户写JAVA客户端访问.NET实现的Web service的演示代码开掘了贰个风趣的题目。为有保持安全性,使用了wse2.0 sp2的ws-security,自个儿达成了UsernameTokenManager的AuthenticateToken方法。当从本机的浏览器访问该服务时,重临HTTP 500错误。写了一个winform客户端的测试代码,当使用不科学的用户名与密码时,服务抛出荒谬,使用科学的用户名与密码时,服务再次回到正确的结果,1切看起来都很健康。但当使用java的客户端访问时,无论采Nash么的客户名与密码,服务均能准确重临结果。不掌握是还是不是WSE二.0的bug依然安装的难题,让jeet万分沉闷。
以身作则代码如下:
1、WEB service代码:

  上边CompilerParameters 类的言传身教设置了多个属性,GenerateExecutable是设置编译后生成的是dll依然exe,true是dll,false是exe,默许是生成dll的。OutputAssembly则是设置生成文书的文书名。对于GenerateInMemory那性情子,MSDN上说的是true就把编译的变型的主次集保留在内部存款和储蓄器中,通过CompilerResults实例的CompiledAssembly能够赚取。假使设为false则是调换文书保留在磁盘上,通过CompilerResults实例的PathToAssembly实例获取程序集的路子。不过经小编实践,无论GenerateInMemory设置哪些值,都会在硬盘上扭转对应的文书,分裂在于OutputAssembly设置了对应的文书名的话,生成的文本会存在内定路径上,否则会存放在系统的目前文件夹里面。都足以通过CompiledAssembly获取生存的顺序集。GenerateInMemory设值区别在于设置了true,PathToAssembly的值为null,false就能够得到生成文书的门径。不过该类还有个别比较可行的品质没用上,ReferencedAssemblies属性设置编写翻译时要引用的dll;MainClass属性设置主类的名目,假使要编写翻译的代码中隐含了多少个饱含Main方法的类,生成的程序选拔前后原则只举办第一个Main方法,假如要实践其他类的Main方法的时候,就足以经过MainClass来设置。

计算机网络 378

2、实现UsernameTokenManager

  上面用到的是CompileAssemblyFromSource,传进去首个参数是索要编写翻译的代码字符串。而第三个办法传入的参数是急需编写翻译的代码文件名。以上八个主意都回去同二个值——三个CompilerResults的实例。经常这几个示例能够明白编写翻译是或不是因此,即使失利了不当的代码的地方,更首要的是能够获得编写翻译成功的主次集。当编写翻译成功之后,要么就通过反射来调用生成好的事物,要么就径直展开进度去实践exe。

 

3、Web service的web.config配置

 1         private CodeCompileUnit CreateUnitTest()
 2         {
 3             CodeCompileUnit unit = new CodeCompileUnit();
 4 
 5             //命名空间设置
 6             CodeNamespace codeNamespace = new CodeNamespace("TestNameSpace");//设置命名空间名字
 7             codeNamespace.Imports.Add(new CodeNamespaceImport("System"));//引用的命名空间
 8             unit.Namespaces.Add(codeNamespace);
 9 
10             //类的定义
11             CodeTypeDeclaration testClass = new CodeTypeDeclaration("TestClass");//类名
12             testClass.Attributes= MemberAttributes.Public;
13             testClass.CustomAttributes.Add(new CodeAttributeDeclaration("Serializable"));//类的Attributes
14             codeNamespace.Types.Add(testClass);
15 
16             //字段定义
17             CodeMemberField strMember = new CodeMemberField("String", "str1");
18             strMember.Attributes= MemberAttributes.Private;
19             testClass.Members.Add(strMember);
20 
21             CodeMemberField _default = new CodeMemberField("TestClass", "_default");
22             _default.Attributes = MemberAttributes.Private | MemberAttributes.Static;
23             _default.InitExpression = new CodeSnippetExpression("new TestClass("hello world")");
24             testClass.Members.Add(_default);
25 
26             //构造函数定义
27             CodeConstructor constructor = new CodeConstructor();
28             constructor.Attributes = MemberAttributes.Public;
29             constructor.Parameters.Add(new CodeParameterDeclarationExpression("String", "para1"));
30             constructor.Statements.Add(new CodeSnippetStatement("str1=para1;"));
31             testClass.Members.Add(constructor);
32 
33             //方法定义
34             CodeMemberMethod method = new CodeMemberMethod();
35             method.Name = "Print";
36             method.Attributes = MemberAttributes.Static | MemberAttributes.Public;
37             CodeParameterDeclarationExpression para1 = new CodeParameterDeclarationExpression("String", "str");
38             method.Parameters.Add(para1);
39             method.ReturnType = new CodeTypeReference(typeof(void));
40             CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console");
41             CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
42                 csSystemConsoleType, "WriteLine", 
43                 new CodeArgumentReferenceExpression("str"));
44             method.Statements.Add(cs1);
45             testClass.Members.Add(method);
46 
47             //程序入口定义 Main方法
48             CodeEntryPointMethod mainMethod = new CodeEntryPointMethod();
49             mainMethod.Attributes = MemberAttributes.Public;
50             CodeTypeReferenceExpression csMethodCall = new CodeTypeReferenceExpression("TestNameSpace.TestClass");
51             cs1 = new CodeMethodInvokeExpression(csMethodCall, "Print", new CodeTypeReferenceExpression("_default.str1"));
52             mainMethod.Statements.Add(cs1);
53             testClass.Members.Add(mainMethod);
54 
55             return unit;
56         }
57 
58         private void Compile(CodeCompileUnit unit)
59         {
60             comPara.GenerateExecutable = true;
61             comPara.GenerateInMemory = true;
62             comPara.OutputAssembly = "SimpleCompile.exe";
63             //comPara.MainClass = "Test2";
64 
65             CompilerResults result = compiler.CompileAssemblyFromDom(comPara, unit);
66 
67             if (result.Errors.Count == 0)
68             {
69                 Assembly assembly = result.CompiledAssembly;
70                 Type AType = assembly.GetType("TestNameSpace.TestClass");
71                 MethodInfo method = AType.GetMethod("Main", BindingFlags.Static | BindingFlags.Public);
72                 Console.WriteLine(method.Invoke(null, null));
73             }
74             else
75             {
76                 foreach (CompilerError item in result.Errors)
77                 {
78                     Console.WriteLine(item.ErrorText);
79                 }
80             }
81         }
82 
83         private void CreteCodeFile(CodeCompileUnit unit, string fileName)
84         {
85             StringBuilder sb=new StringBuilder();
86             using (StringWriter  tw=new StringWriter(sb))
87             {
88                 compiler.GenerateCodeFromCompileUnit(unit, tw, new CodeGeneratorOptions());
89             }
90             File.WriteAllText(fileName, sb.ToString());
91         }

首先,传回前端的c#在线代码,实行预编写翻译,用CSharpCodeProvider那几个点子。设置编写翻译版本三.5

计算机网络 379using System;
计算机网络 380using System.Collections;
计算机网络 381using System.ComponentModel;
计算机网络 382using System.Data;
计算机网络 383using System.Diagnostics;
计算机网络 384using System.Web;
计算机网络 385using System.Web.Services;
计算机网络 386using System.Web.Services.Protocols;
计算机网络 387using Microsoft.Web.Services2;
计算机网络 388using Microsoft.Web.Services2.Security;
计算机网络 389using Microsoft.Web.Services2.Security.Tokens;
计算机网络 390
计算机网络 391namespace WebTest
计算机网络 392计算机网络 393计算机网络 394{
计算机网络 395计算机网络 396    /**//// <summary>
计算机网络 397    /// SumService 的摘要表明。
计算机网络 398    /// </summary>
计算机网络 399    public class SumService : System.Web.Services.WebService
计算机网络 400计算机网络 401    计算机网络 402{
计算机网络 403        public SumService()
计算机网络 404计算机网络 405        计算机网络 406{
计算机网络 407            //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必不可缺的
计算机网络 408            InitializeComponent();
计算机网络 409        }
计算机网络 410
计算机网络 411计算机网络 412        组件设计器生成的代码#region 组件设计器生成的代码
计算机网络 413        
计算机网络 414        //Web 服务设计器所不可缺少的
计算机网络 415        private IContainer components = null;
计算机网络 416                
计算机网络 417计算机网络 418        /**//// <summary>
计算机网络 419        /// 设计器扶助所需的艺术 - 不要采纳代码编辑器修改
计算机网络 420        /// 此办法的剧情。
计算机网络 421        /// </summary>
计算机网络 422        private void InitializeComponent()
计算机网络 423计算机网络 424        计算机网络 425{
计算机网络 426        }
计算机网络 427
计算机网络 428计算机网络 429        /**//// <summary>
计算机网络 430        /// 清理全部正在利用的财富。
计算机网络 431        /// </summary>
计算机网络 432        protected override void Dispose( bool disposing )
计算机网络 433计算机网络 434        计算机网络 435{
计算机网络 436            if(disposing && components != null)
计算机网络 437计算机网络 438            计算机网络 439{
计算机网络 440                components.Dispose();
计算机网络 441            }
计算机网络 442            base.Dispose(disposing);        
计算机网络 443        }
计算机网络 444        
计算机网络 445        #endregion
计算机网络 446
计算机网络 447        // WEB 服务示范
计算机网络 448        // HelloWorld() 示例服务重临字符串 Hello World
计算机网络 449        // 若要转移,请撤除注释下列行,然后保留并扭转项目
计算机网络 450        // 若要测试此 Web 服务,请按 F伍 键
计算机网络 451//
计算机网络 452        [WebMethod]
计算机网络 453        public string HelloWorld()
计算机网络 454计算机网络 455        计算机网络 456{
计算机网络 457            SoapContext requestContext=RequestSoapContext.Current;
计算机网络 458            if(requestContext==null)
计算机网络 459                throw new ApplicationException("Only soap request are permitted.");
计算机网络 460            return "Hello World.";
计算机网络 461        }
计算机网络 462        [SoapRpcMethod(Action="]
计算机网络 463        [WebMethod]
计算机网络 464        public int IntAdd(int a,int b)
计算机网络 465计算机网络 466        计算机网络 467{
计算机网络 468            SoapContext requestContext=RequestSoapContext.Current;
计算机网络 469            
计算机网络 470            if(requestContext==null)
计算机网络 471                throw new ApplicationException("Only soap request are permitted.");
计算机网络 472            
计算机网络 473
计算机网络 474            return a b;
计算机网络 475        }
计算机网络 476
计算机网络 477        
计算机网络 478    }
计算机网络 479    }
计算机网络 480

然后跑到眼下运转程序的目录下就会找到变化的可执行文件SimpleCompile.exe。这一个正是最简单易行的动态编译。

回到结果。

  那么地点还有三个主意没介绍,这些艺术的参数是CodeCompileUnit,那个类MSDN上的解释是为 CodeDOM 程序图形提供容器。但个人以为它能够说是二个代码的构造器,CompileAssemblyFromFile方法和CompileAssemblyFromSource方法无论代码来自文件或者字符串,它都以确实的C#代码,不过用了CodeCompileUnit就以为通过布置的样式来经行编制程序,而不是逐行逐行地写。先看看上边代码,定义了三个方法,一个是结构CodeCompileUnit实例,其他四个法子是生成C#代码并出口到文件和编写翻译生成

本文由韦德国际1946英国发布于计算机网络,转载请注明出处:在线运行,动态编译

关键词:

上一篇:H5直播避坑指南,踩坑小计

下一篇:没有了