动态编译,在线运行

起来变成c#代码的在线编辑。    

在帮客商写JAVA顾客端访问.NET完成的Web service的演示代码开采了一个风趣的主题材料。为有保持安全性,使用了wse2.0 sp2的ws-security,本人完结了UsernameTokenManager的AuthenticateToken方法。当从本机的浏览器访谈该服务时,重返HTTP 500谬误。写了一个winform客户端的测验代码,当使用不得法的客商名与密码时,服务抛出荒唐,使用科学的客户名与密码时,服务再次来到正确的结果,一切看起来都很健康。但当使用java的顾客端访谈时,无论使用什么的客商名与密码,服务均能科学重回结果。不明了是不是WSE2.0的bug依旧安装的题目,让jeet非凡苦恼。
亲自去做代码如下:
1、WEB service代码:

  以后也触及一下动态编写翻译吧!二零一八年也闻讯过了,但是只瞄了一眼,没去实行,今日有同事在介绍动态编写翻译,此时笔者因为一些原因无法去听取。以往就看一下

Build-in Functionis
abs() dict() help() min() setattr()
all() dir() hex() next() slice()
any() divmod() id() object() sorted()
ascii() enumerate() input() oct() staticmethod()
bin() eval() int() open() str()
bool() exec() isinstance() ord() sum()
bytearray() filter() issubclass() pow() super()
bytes() float() iter() print() tuple()
callable() format() len() property() type()
chr() frozenset() list() range() vars()
classmethod() getattr() locals() repr() zip()
compile() globals() map() reversed() __import()__
complex() hasattr() max() round()
delattr() hash() memoryview() set()

图片 1

图片 2using System;
图片 3using System.Collections;
图片 4using System.ComponentModel;
图片 5using System.Data;
图片 6using System.Diagnostics;
图片 7using System.Web;
图片 8using System.Web.Services;
图片 9using System.Web.Services.Protocols;
图片 10using Microsoft.Web.Services2;
图片 11using Microsoft.Web.Services2.Security;
图片 12using Microsoft.Web.Services2.Security.Tokens;
图片 13
图片 14namespace WebTest
图片 15图片 16图片 17{
图片 18图片 19    /**//// <summary>
图片 20    /// SumService 的摘要表明。
图片 21    /// </summary>
图片 22    public class SumService : System.Web.Services.WebService
图片 23图片 24    图片 25{
图片 26        public SumService()
图片 27图片 28        图片 29{
图片 30            //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必备的
图片 31            InitializeComponent();
图片 32        }
图片 33
图片 34图片 35        组件设计器生成的代码#region 组件设计器生成的代码
图片 36        
图片 37        //Web 服务设计器所必得的
图片 38        private IContainer components = null;
图片 39                
图片 40图片 41        /**//// <summary>
图片 42        /// 设计器协理所需的法子 - 不要选择代码编辑器改良
图片 43        /// 此措施的剧情。
图片 44        /// </summary>
图片 45        private void InitializeComponent()
图片 46图片 47        图片 48{
图片 49        }
图片 50
图片 51图片 52        /**//// <summary>
图片 53        /// 清理全部正在利用的财富。
图片 54        /// </summary>
图片 55        protected override void Dispose( bool disposing )
图片 56图片 57        图片 58{
图片 59            if(disposing && components != null)
图片 60图片 61            图片 62{
图片 63                components.Dispose();
图片 64            }
图片 65            base.Dispose(disposing);        
图片 66        }
图片 67        
图片 68        #endregion
图片 69
图片 70        // WEB 服务示范
图片 71        // HelloWorld() 示例服务再次来到字符串 Hello World
图片 72        // 若要调换,请撤消注释下列行,然后保留并转移项目
图片 73        // 若要测量检验此 Web 服务,请按 F5 键
图片 74//
图片 75        [WebMethod]
图片 76        public string HelloWorld()
图片 77图片 78        图片 79{
图片 80            SoapContext requestContext=RequestSoapContext.Current;
图片 81            if(requestContext==null)
图片 82                throw new ApplicationException("Only soap request are permitted.");
图片 83            return "Hello World.";
图片 84        }
图片 85        [SoapRpcMethod(Action="]
图片 86        [WebMethod]
图片 87        public int IntAdd(int a,int b)
图片 88图片 89        图片 90{
图片 91            SoapContext requestContext=RequestSoapContext.Current;
图片 92            
图片 93            if(requestContext==null)
图片 94                throw new ApplicationException("Only soap request are permitted.");
图片 95            
图片 96
图片 97            return a b;
图片 98        }
图片 99
图片 100        
图片 101    }
图片 102    }
图片 103

  整个编写翻译进程最基本用到多少个类CodeDomProvider类和CompilerParameters 类。前面多个就担当三个编写翻译器,前者则是用来记录传递给编写翻译器的一些参数。在开始时代学习C#的运用,鄙人未有用得上VS,只可以靠CSC,那么CSC就相近于CodeDomProvider那么些类,而CSC本人会有繁多命令参数,CompilerParameters 类就会为CSC传递一些编写翻译消息(生成类型,引用程序集等卡塔 尔(英语:State of Qatar)。那么下边则尝试用最简便易行的点子看看那些动态编译。

all(iterable)

假定成分都为True,也许为空,再次来到True.

all([1,2,4,True])
all([])
all([1,2,False])

True
True
False

 

2、实现UsernameTokenManager

 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         }

any(iterable)

假诺大肆一成分为True 再次来到True, 假若为空 ,重返False

首先,传回前端的c#在线代码,实行预编写翻译,用CSharpCodeProvider这一个方法。设置编写翻译版本3.5

图片 104using System;
图片 105using Microsoft.Web.Services2;
图片 106using Microsoft.Web.Services2.Security;
图片 107using Microsoft.Web.Services2.Security.Tokens;
图片 108using System.Security;
图片 109using System.Security.Permissions;
图片 110
图片 111namespace WebTest
图片 112图片 113图片 114{
图片 115图片 116    /**//// <summary>
图片 117    /// CustomUsernameTokenManager 的摘要表达。
图片 118    /// </summary>
图片 119    [SecurityPermission(SecurityAction.Demand,
图片 120         Flags= SecurityPermissionFlag.UnmanagedCode)]
图片 121
图片 122    public class CustomUsernameTokenManager:UsernameTokenManager
图片 123图片 124    图片 125{
图片 126        public CustomUsernameTokenManager()
图片 127图片 128        图片 129{
图片 130            //
图片 131            // TODO: 在那处增添构造函数逻辑
图片 132            //
图片 133        }
图片 134
图片 135        protected override string AuthenticateToken(UsernameToken token)
图片 136图片 137        图片 138{
图片 139            if(token==null)
图片 140                throw new ArgumentNullException();
图片 141            if(token.Username=="username")
图片 142                return "password";
图片 143            else
图片 144                return "love";
图片 145            
图片 146//                byte[] encodedUsername=System.Text.Encoding.UTF8.GetBytes(token.Username);
图片 147//                if(System.Text.Encoding.UTF8.GetString(encodedUsername)=="username")
图片 148//                    return "password";
图片 149//            else
图片 150//                    return "love";
图片 151
图片 152        }
图片 153
图片 154    }
图片 155}
图片 156

然后跑到日前运作程序的目录下就能够找到变化的可实践文件SimpleCompile.exe。这么些正是最简单易行的动态编写翻译。

ascii(object)

返回object 的 string类型.

ascii([[1,2,3],2,3])

output
'[[1,2,3],2,3]'

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

3、Web service的web.config配置

  上面CompilerParameters 类的示范设置了五性情格,GenerateExecutable是设置编写翻译后生成的是dll照旧exe,true是dll,false是exe,暗中同意是生成dll的。OutputAssembly则是设置生成文书的公文名。对于GenerateInMemory那特本性,MSDN上说的是true就把编译的更换的主次集保留在内部存款和储蓄器中,通过CompilerResults实例的CompiledAssembly能够得到。如若设为false则是生成文书保留在磁盘上,通过CompilerResults实例的PathToAssembly实例获取程序集的门道。可是经小编实行,无论GenerateInMemory设置哪些值,都会在硬盘上调换对应的文本,区别在于OutputAssembly设置了对应的公文名的话,生成的文件会存在钦命路径上,不然会寄存在系统的不经常文件夹里面。都得以透过CompiledAssembly获取生存的程序集。GenerateInMemory设值分化在于设置了true,帕特hToAssembly的值为null,false就能够赢得生成文书的门道。但是该类还应该有个别相比较灵通的属性没用上,ReferencedAssemblies属性设置编写翻译时要援用的dll;MainClass属性设置主类的名称,假如要编译的代码中包罗了多个包含Main方法的类,生成的程序行使前后原则只举行第多个Main方法,假设要施行别的类的Main方法的时候,就可以由此MainClass来设置。

bin(x)

回到二进制字符串带头带'0b' ,平日只好是int ,不是int 必需定义__index()__方法

设置生成实践文书的品类GenerateExecutable:True - exe file generation, false - dll file generation。

图片 157<?xml version="1.0" encoding="utf-8"?>
图片 158<configuration>
图片 159  <configSections>
图片 160    <section name="microsoft.web.services2" type="Microsoft.Web.Services2.Configuration.WebServicesConfiguration, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
图片 161  </configSections>
图片 162  <system.web>
图片 163    <webServices>
图片 164      <protocols>
图片 165        <remove name="HttpGet" />
图片 166        <remove name="HttpPost" />
图片 167      </protocols>
图片 168      <soapExtensionTypes>
图片 169        <add type="Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" priority="1" group="0" />
图片 170      </soapExtensionTypes>
图片 171    </webServices>
图片 172    <!--  动态调度编写翻译
图片 173          设置 compilation debug="true" 以启用 ASPX 调节和测量试验。不然,将此值设置为
图片 174          false 将拉长此应用程序的周转时质量。
图片 175          设置 compilation debug="true" 以将调节和测量试验符号(.pdb 音讯)
图片 176          插入到编写翻译页中。因为那将创建实践起来
图片 177          极慢的大文件,所以理应只在调节和测量检验时将此值设置为 true,而在有着其余时候都安装为
图片 178          false。有关更加的多新闻,请参见有关
图片 179          调节和测验 ASP.NET 文件的文书档案。
图片 180    -->
图片 181    <compilation defaultLanguage="c#" debug="true" />
图片 182    <!--  自定义错误音信
图片 183          设置 customErrors mode="On" 或 "RemoteOnly" 以启用自定义错误音信,或设置为 "Off" 以禁止使用自定义错误新闻。 
图片 184          为每个要拍卖的荒唐增加 <error> 标志。
图片 185
图片 186          "On" 始终展现自定义(友好的)音讯。
图片 187          "Off" 始终展现详细的 ASP.NET 错误音信。
图片 188          "RemoteOnly" 只对不在当地 Web 服务器上运转的
图片 189           客商呈现自定义(友好的)消息。出于安全目标,建议利用此设置,以便 
图片 190           不向远程顾客端体现应用程序的详细音讯。
图片 191    -->
图片 192    <customErrors mode="RemoteOnly" />
图片 193    <identity impersonate="true" />
图片 194    <!--  身份验证 
图片 195          此节设置应用程序的身份验证攻略。大概的格局是 "Windows"、 
图片 196          "Forms"、 "Passport" 和 "None"
图片 197
图片 198          "None" 不推行身份验证。 
图片 199          "Windows" IIS 按照拂用程序的装置进行身份验证 
图片 200            (基本、简要或归总 Windows)。在 IIS 中必须禁止使用无名氏访问。
图片 201          "Forms" 您为客户提供三个输入凭据的自定义窗体(Web 页),然后 
图片 202           在你的应用程序中证实他们的地点。顾客凭据标志存款和储蓄在 Cookie 中。
图片 203          "Passport" 身份验证是经过 Microsoft 的汇总身份验证服务执行的,
图片 204           它为成员站点提供单身登陆和宗旨配置文件服务。
图片 205    -->
图片 206    <authentication mode="Windows" />
图片 207    <!--  授权 
图片 208           此节设置应用程序的授权战略。能够允许或谢绝不一样的客户或剧中人物访谈
图片 209          应用程序能源。通配符: "*" 表示任何人,"?" 表示无名氏
图片 210          (未经身份验证的)顾客。
图片 211    -->
图片 212    <authorization>
图片 213      <allow users="*" />
图片 214      <!-- 允许全数顾客 -->
图片 215      <!--  <allow     users="[逗号分隔的客户列表]"
图片 216                             roles="[逗号分隔的角色列表]"/>
图片 217                  <deny      users="[逗号分隔的顾客列表]"
图片 218                             roles="[逗号分隔的剧中人物列表]"/>
图片 219            -->
图片 220    </authorization>
图片 221    <!--  应用程序等级追踪记录
图片 222          应用程序等级追踪为应用程序中的每大器晚成页启用跟踪日志输出。
图片 223          设置 trace enabled="true" 能够启用应用程序追踪记录。若是 pageOutput="true",则
图片 224          在每风度翩翩页的底层展现追踪消息。不然,能够经过浏览 Web 应用程序
图片 225           根目录中的 "trace.axd" 页来查看
图片 226          应用程序追踪日志。
图片 227    -->
图片 228    <trace enabled="false" requestLimit="10" pageOutput="false" traceMode="SortByTime" localOnly="true" />
图片 229    <!--  会话状态设置
图片 230          默许意况下,ASP.NET 使用 Cookie 来标志哪些央求归属特定的对话。
图片 231          借使 Cookie 不可用,则足以经过将会话标志符加多到 UENVISIONL 来追踪会话。
图片 232         若要禁止使用 Cookie,请设置 sessionState cookieless="true"。
图片 233    -->
图片 234    <sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
图片 235    <!--  全球化
图片 236          此节设置应用程序的环球化设置。
图片 237    -->
图片 238    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />
图片 239  </system.web>
图片 240  <microsoft.web.services2>
图片 241    <diagnostics>
图片 242      <trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
图片 243      <detailedErrors enabled="false" />
图片 244    </diagnostics>
图片 245    <security>
图片 246        <securityTokenManager type="WebTest.CustomUsernameTokenManager,WebTest" xmlns:wsse="" qname="wsse:UsernameToken" />
图片 247    </security>
图片 248  </microsoft.web.services2>
图片 249</configuration>

  CodeDomProvider只是三个抽象类而已,对于不相同的程序语言,有相应的类去继续那些抽象类,C#的正是CSharpCodeProvider类。用于编写翻译的格局有多个,方法的申明如下

class bool([x])

归来bool 结果,if x是 False 只怕轻巧重回False,其余重返True,bool()是int的子集(subclass卡塔 尔(英语:State of Qatar)

编写翻译后再次回到result结果。

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

public virtual CompilerResults CompileAssemblyFromDom(CompilerParameters options, params CodeCompileUnit[] compilationUnits);
public virtual CompilerResults CompileAssemblyFromFile(CompilerParameters options, params string[] fileNames);
public virtual CompilerResults CompileAssemblyFromSource(CompilerParameters options, params string[] sources);

class bytearray([source[, encoding[, errors]]])

重回新的位数组(0<=x<256), 它有好些个可变连串的常用方法
依据源参数的例外早先化数组

  • 假使它是二个字符串,那么您还非得给出编码(以致可选的谬误)参数;bytearray()然后接受str.encode()将-
    字符串调换为字节。
  • 生龙活虎旦它是叁个大背头,那么数组将具有这几个分寸,并将用null字节初阶化。
  • 如若它是符合缓冲区接口的对象,则将应用对象的只读缓冲区来伊始化字节数组。
  • 倘诺它是可迭代的,那么它必得是range 0 < = x < 256的整数的迭代,它被用作数组的领头内容
b = bytearray()
len(b)
b = bytearray('中文', 'utf-8')
len(b)
b = bytearray(5)
len(b)
bytearray([1,2,3,4,5])
len(b)

输出
bytearray(b'')
0
bytearray(b'xe4xb8xadxe6x96x87')
6
bytearray(b'x00x00x00x00x00')
5
bytearray(b'x01x02x03x04x05')
5

 

图片 250using System;
图片 251using System.Drawing;
图片 252using System.Collections;
图片 253using System.ComponentModel;
图片 254using System.Windows.Forms;
图片 255using System.Data;
图片 256using Microsoft.Web.Services2;
图片 257using Microsoft.Web.Services2.Security;
图片 258using Microsoft.Web.Services2.Security.Tokens;
图片 259using GDS.Ldap;
图片 260using System.Text;
图片 261
图片 262namespace WSEClientTest
图片 263图片 264图片 265{
图片 266图片 267    /**//// <summary>
图片 268    /// Form1 的摘要表达。
图片 269    /// </summary>
图片 270    public class Form1 : System.Windows.Forms.Form
图片 271图片 272    图片 273{
图片 274        private System.Windows.Forms.Button button1;
图片 275        
图片 276图片 277        /**//// <summary>
图片 278        /// 必需的设计器变量。
图片 279        /// </summary>
图片 280        private System.ComponentModel.Container components = null;
图片 281
图片 282        public Form1()
图片 283图片 284        图片 285{
图片 286            //
图片 287            // Windows 窗体设计器援助所不能缺少的
图片 288            //
图片 289            InitializeComponent();
图片 290
图片 291            //
图片 292            // TODO: 在 InitializeComponent 调用后增添其余构造函数代码
图片 293            //
图片 294        }
图片 295
图片 296图片 297        /**//// <summary>
图片 298        /// 清理全部正在使用的能源。
图片 299        /// </summary>
图片 300        protected override void Dispose( bool disposing )
图片 301图片 302        图片 303{
图片 304            if( disposing )
图片 305图片 306            图片 307{
图片 308                if (components != null) 
图片 309图片 310                图片 311{
图片 312                    components.Dispose();
图片 313                }
图片 314            }
图片 315            base.Dispose( disposing );
图片 316        }
图片 317
图片 318图片 319        Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
图片 320图片 321        /**//// <summary>
图片 322        /// 设计器扶持所需的主意 - 不要采取代码编辑器改良
图片 323        /// 此情势的剧情。
图片 324        /// </summary>
图片 325        private void InitializeComponent()
图片 326图片 327        图片 328{
图片 329            this.button1 = new System.Windows.Forms.Button();
图片 330            
图片 331            this.SuspendLayout();
图片 332            // 
图片 333            // button1
图片 334            // 
图片 335            this.button1.Location = new System.Drawing.Point(32, 32);
图片 336            this.button1.Name = "button1";
图片 337            this.button1.TabIndex = 0;
图片 338            this.button1.Text = "button1";
图片 339            this.button1.Click  = new System.EventHandler(this.button1_Click);
图片 340        
图片 341            // 
图片 342            // Form1
图片 343            // 
图片 344            this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
图片 345            this.ClientSize = new System.Drawing.Size(456, 325);            
图片 346            this.Controls.Add(this.button1);
图片 347            this.Name = "Form1";
图片 348            this.Text = "Form1";
图片 349            this.ResumeLayout(false);
图片 350
图片 351        }
图片 352        #endregion
图片 353
图片 354图片 355        /**//// <summary>
图片 356        /// 应用程序的主入口点。
图片 357        /// </summary>
图片 358        [STAThread]
图片 359        static void Main() 
图片 360图片 361        图片 362{
图片 363            Application.Run(new Form1());
图片 364        }
图片 365
图片 366        private void button1_Click(object sender, System.EventArgs e)
图片 367图片 368        图片 369{
图片 370            UsernameToken token=new UsernameToken("username","password1",PasswordOption.SendPlainText);
图片 371            try
图片 372图片 373            图片 374{
图片 375                localhost.SumServiceWse serviceProxy=new localhost.SumServiceWse();
图片 376                SoapContext requestContext=serviceProxy.RequestSoapContext;
图片 377                requestContext.Security.Timestamp.TtlInSeconds=60;
图片 378                requestContext.Security.Tokens.Add(token);
图片 379                
图片 380                requestContext.Security.Elements.Add(new MessageSignature(token));
图片 381                
图片 382                int sum=serviceProxy.IntAdd(3,5);
图片 383                MessageBox.Show(sum.ToString());
图片 384
图片 385            }
图片 386            catch (System.Web.Services.Protocols.SoapException se) 
图片 387图片 388            图片 389{
图片 390                MessageBox.Show(se.ToString());
图片 391            }
图片 392            catch (Exception ex) 
图片 393图片 394            图片 395{
图片 396                MessageBox.Show(ex.ToString());
图片 397                return;
图片 398            }
图片 399        
图片 400        }
图片 401
图片 402    
图片 403        }
图片 404    }
图片 405
图片 406
图片 407

 

bytes([source[, encoding[, errors]]])

再次bytearray()的事例,输出结果为
b''
b'xe4xb8xadxe6x96x87'
b'x00x00x00x00x00'
b'x01x02x03x04x05'

图片 408

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

  上边用到的是CompileAssemblyFromSource,传进去第二个参数是要求编译的代码字符串。而第四个章程传入的参数是亟需编写翻译的代码文件名。以上几个艺术都回去同八个值——叁个CompilerResults的实例。平时那个示例可以预知编写翻译是不是通过,假使退步了不当的代码的职位,更要紧的是能够获取编写翻译成功的主次集。当编写翻译成功未来,要么就透过反射来调用生成好的东西,要么就径直展开进程去实施exe。

callabel(object)

非常管理:假若编写翻译时发生错误,生成错误编号和谬误文本音讯并回到给前端。

图片 409/*
图片 410 * Created on 2005-2-26
图片 411 *
图片 412 * TODO To change the template for this generated file go to
图片 413 * Window - Preferences - Java - Code Style - Code Templates
图片 414 */
图片 415package WSEClient;
图片 416
图片 417import net.vitale.filippo.axis.handlers.*;
图片 418import org.apache.axis.client.*;
图片 419import javax.xml.namespace.*;
图片 420
图片 421/**
图片 422 * @author Jeet
图片 423 *
图片 424 * TODO To change the template for this generated type comment go to
图片 425 * Window - Preferences - Java - Code Style - Code Templates
图片 426 */
图片 427public class TestService
图片 428{
图片 429
图片 430    static String usernameS = null; 
图片 431    static String passwordS = null; 
图片 432
图片 433    public static void main(String[] args)
图片 434    {
图片 435        try { 
图片 436            Integer i = new Integer(5); 
图片 437            Integer j = new Integer(2); 
图片 438            String endpoint=""; 
图片 439            Service service = new Service(); 
图片 440            Call call = (Call)service.createCall(); 
图片 441            call.setTargetEndpointAddress(new java.net.URL(endpoint)); 
图片 442            call.setOperationName(new QName("")); 
图片 443            call.addParameter("a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN); 
图片 444            call.addParameter("b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN); 
图片 445            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT); 
图片 446//            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
图片 447            call.setUseSOAPAction(true); 
图片 448            call.setSOAPActionURI(""); 
图片 449            //add a user token 
图片 450            usernameS="1234";
图片 451            passwordS = "password"; 
图片 452            call.setUsername(usernameS); 
图片 453            call.setPassword(passwordS); 
图片 454    
图片 455            call.setProperty(WsseClientHandler.PASSWORD_OPTION, WsseClientHandler.PASSWORD_DIGEST_WITH_NONCE); 
图片 456            call.setClientHandlers(new WsseClientHandler(), null); 
图片 457            Integer k = (Integer)call.invoke(new Object[]{i,j}); 
图片 458            System.out.println( "result is "   k.toString()   "."); 
图片 459//            Vector inputs = new Vector();
图片 460//            String s=(String)call.invoke(inputs.toArray());
图片 461//            System.out.println("result is " s  ".");
图片 462                  
图片 463           } 
图片 464           catch (org.apache.axis.AxisFault e) 
图片 465           { 
图片 466            if (e.getFaultCode().toString() .equals("{")) 
图片 467             System.err.println("The usernameToken and password aren't right! "); 
图片 468            else { 
图片 469                   System.err.println(e.getFaultCode().toString()); 
图片 470            } 
图片 471           } 
图片 472           catch(Exception e) 
图片 473           { 
图片 474            System.err.println(e.toString()) ; 
图片 475           } 
图片 476          } 
图片 477      } 
图片 478
图片 479
图片 480

  那么地点还只怕有贰个主意没介绍,这一个主意的参数是CodeCompileUnit,那么些类MSDN上的表达是为 CodeDOM 程序图形提供容器。但个人认为它能够说是二个代码的构造器,CompileAssemblyFromFile方法和CompileAssemblyFromSource方法无论代码来自文件大概字符串,它都以实在的C#代码,可是用了CodeCompileUnit就感到通过安排的款式来经行编制程序,并不是逐行逐行地写。先看看上边代码,定义了四个办法,三个是构造CodeCompileUnit实例,其他三个点子是生成C#代码并出口到文件和编写翻译生成

chr(i)

归来unicode编码字符串
范围0到0x10FFFF

 

 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         }

@classmethod()

类装饰器

图片 481

 

@staticmethod()

静态方法

找到代码中的Main方法,并运营(CompiledMethod.Invoke(null, null);卡塔尔国

  下面代码笔者认为的基本点在于构造CodeCompileUnit,在MSDN上对GenerateCodeFromCompileUnit的叙说是:基于蕴含在 CodeCompileUnit 对象的钦赐数组中的 System.CodeDom 树,使用钦赐的编写翻译器设置编写翻译程序集。这里有个DOM笔者记忆了JS对HTML的DOM树,可是在构造整个CodeCompileUnit进程中,也深认为树的档次结构,四个code文件之中有八个命名空间,命名空间里面又有各类类型(类,接口,委托卡塔 尔(阿拉伯语:قطر‎,类型里面又含有各自的成员(字段,属性,方法卡塔 尔(阿拉伯语:قطر‎,方法里面含有了话语,语句里面又富含了表达式。

compile(source, filename, mode, flags=0, dont_inherit=False, optimize=-1)

那么些函数用来编写翻译风度翩翩段字符串的源码,结果能够生成字节码或然AST(抽像语法树卡塔尔国,字节码能够动用函数exec()来实践,而AST可以选取eval()来持续编写翻译。

  • 参数source是生龙活虎串字符串的源码,或许是AST对象数组。
  • 参数filename是读取字符串的公文对象,假如不是从文件里读取源码来编写翻译,那么这里能够放一些用来标记这么些代码的字符串。
  • 参数mode是用来指明这种表示的源码类型;若是是exec类型,表示那是一个体系语句,能够开展运作;若是是eval类型,表示那是八个纯粹的表明式语句,能够用来计量相应的值出来;假如是single类型,表示那是叁个十足语句,接受相互影响方式进行,在此种场所下,如若是三个说明式,经常会输出结果,并非打印为None输出。
  • 可选参数flags和dont_inherit是用来决定编写翻译源码时的标识,能够查阅PEP236文书档案来打听那一个参数,以致有关编写翻译的证实。假诺两岸接纳缺省参数(也即双方都是零值卡塔尔国,在调用本函数编写翻译时,首要选择代码中指明的编写翻译特征来相比较;倘若flags参数设置有值,而dont_inherit没有安装(便是零值卡塔 尔(英语:State of Qatar),那么编写翻译代码时,不仅仅源码的编写翻译特征起效果,何况flags指明的风味也起效用,特别两个的并集;假设参数dont_inherit设置有值(正是非零值卡塔 尔(阿拉伯语:قطر‎,编写翻译语句时唯有参数flags指明的编写翻译特征值起功用,就是不采取源码里指明的风味。
  • 编译特征是按位图的措施设置到参数里,可以查看__future__
  • 可选参数optimize是用来指明编译器使用优化的阶段;缺省值是-1,表示使用命令行参数-O中拿走的优化品级为准;如果设置值为0(就是不用优化,debug是设置true卡塔 尔(英语:State of Qatar),是未曾优化;假设设置值为1,assert语句被去除,debug安装为false;要是设置值为2,除了设置值为1的机能之外,还恐怕会把代码里文书档案表达也删除掉,达到最好优化结果。
  • 本函数编译代码时,尽管语法出错会重返SyntaxError;若是代码包罗部分空字节,则赶回类型错误TypeError。
#compile()
str = "for i in range(0,10): print(i)"
c = compile(str,'','exec')   # 编译为字节代码对象
exec(c)                          # 执行

str2 = "3*x   4*y"
c2 = compile(str2, '', 'eval')  # 编译为表达式

code_str = '''print('olivetree')nprint( 'olivetree123') '''
c = compile(code_str,'<string>','exec')
exec(c)
code_str = '''1 1 '''
c = compile(code_str, '<string>', 'eval'
eval(c)

回去结果。

图片 482

complex([real[, imag])

复合函数 real可以为number和string类型,imag只好为number

complex(2,5)
complex(2)
complex('2.0',5.0)

输出
2 5j
2 0j
2.0 5.0j

 

不过这种方式从开垦人士来讲代码量加大了。

运维示例

  那篇也是纤维素相当少,不上海博物院客园首页了。

开荒页面,有预写好的c#Hello World小程序

图片 483

 

家成业就运维示例

图片 484

 

不当运营示例,报错消息彰显。

图片 485

终极贴上前端ajax代码

    $("#save").click(function (e) {
        e.preventDefault();
        $.ajax({
            type: 'POST',
            url: "CompileTest",
            data: { "CSharpCode": $("#CSharpCode").val() },
            success: function (result) {
                $("#result").text(result);
            },
        });
    });

 

注:

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

 

重定向console的writeLine新闻到字符串sw中。

本文由星彩网app下载发布于计算机编程,转载请注明出处:动态编译,在线运行

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。