动态编写翻译,在线运转
分类:计算机编程

千帆竞发产生c#代码的在线编辑。    

在帮顾客写JAVA客商端访谈.NET达成的Web service的示范代码发掘了一个有意思的标题。为有保持安全性,使用了wse2.0 sp2的ws-security,本身完毕了UsernameTokenManager的AuthenticateToken方法。当从本机的浏览器访谈该服务时,重回HTTP 500漏洞百出。写了三个winform客商端的测量检验代码,当使用不科学的客户名与密码时,服务抛出荒诞,使用正确的客户名与密码时,服务再次来到正确的结果,一切看起来都很健康。但当使用java的客商端访谈时,无论选取什么的客商名与密码,服务均能科学重返结果。不知晓是或不是WSE2.0的bug还是安装的主题材料,让jeet非常苦闷。
身体力行代码如下:
1、WEB service代码:

  现在也触发一下动态编译吧!2018年也闻讯过了,不过只瞄了一眼,没去施行,明天有同事在介绍动态编写翻译,这时自个儿因为有个别原因没办法去听取。现在就看一下

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    /// Sum瑟维斯 的摘要表达。
图片 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传递一些编写翻译音信(生成类型,引用程序集等卡塔 尔(阿拉伯语:قطر‎。那么上边则尝试用最简便易行的点子看看那几个动态编写翻译。

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,PathToAssembly的值为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          假如 库克ie 不可用,则足以经过将会话标记符加多到 UEscortL 来追踪会话。
图片 232         若要禁止使用 库克ie,请设置 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卡塔尔国

编写翻译后归来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,传进去第一个参数是亟需编写翻译的代码字符串。而第2个点子传入的参数是须要编写翻译的代码文件名。以上多个措施都回去同一个值——八个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未有安装(就是零值卡塔尔,那么编写翻译代码时,不唯有源码的编译特征起效果,并且flags指明的表征也起效果,格外两个的并集;假使参数dont_inherit设置有值(就是非零值卡塔 尔(阿拉伯语:قطر‎,编写翻译语句时唯有参数flags指明的编写翻译特征值起效果,正是不行使源码里指明的特色。
  • 编写翻译特征是按位图的法子设置到参数里,能够查阅__future__
  • 可选参数optimize是用来指明编写翻译器使用优化的级差;缺省值是-1,表示使用命令行参数-O中赢得的优化品级为准;如若设置值为0(正是不用优化,debug是安装true卡塔尔国,是绝非优化;假使设置值为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中。

本文由pc28.am发布于计算机编程,转载请注明出处:动态编写翻译,在线运转

上一篇:Smobiler开荒平台,Smobiler学习日志 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • 动态编写翻译,在线运转
    动态编写翻译,在线运转
    千帆竞发产生c#代码的在线编辑。     在帮顾客写JAVA客商端访谈.NET达成的Webservice的示范代码发掘了一个有意思的标题。为有保持安全性,使用了wse2.0sp
  • 二叉树中度为2的结点
    二叉树中度为2的结点
    int Degree2(BitNode *t){ if(t==null) return 0;if(t-lchild!=nullt-rchild!=null) return 1 Degree2(t-lchild) Degree2(t-rchild);return Degree2(t-lchild) Degree2(t-rchild); } 您可能感兴趣的 非递归先
  • 包的区别
    包的区别
    大家平常在python的模块目录中会看见" __init__.py " 那个文件,那么它终归有啥样功效吗? 类 类的概念在不胜枚举语言中出现,相当轻便驾驭。它将数据和操
  • 开发的进化史,中的发展
    开发的进化史,中的发展
    三、查询集合 本文内容 引入 概述 匿名函数     Lambda 表达式     匿名方法 参看资料 引入 本文在 VS 2008 环境下,阐述自己对 Lambda 表达式、匿名函数、
  • 0A_Windows下相同的时候设置Python2和Python3
    0A_Windows下相同的时候设置Python2和Python3
    Gerapy是贰个Scrapy布满式管理模块,本节就来介绍一下它的设置方式。 Last login: Tue May 16 21:05:34 on console➜ ~ brew updatezsh: command not found: brew➜ ~ ruby -e "$(curl -