动态编写翻译,在线运维

By admin in 4858.com on 2019年3月31日

始发形成c#代码的在线编辑。    

在帮客户写JAVA客户端访问.NET完成的Web
service的示范代码发现了2个有意思的标题。为有保险安全性,使用了wse2.0
sp2的ws-security,自身达成了UsernameTokenManager的AuthenticateToken方法。当从本机的浏览器访问该服务时,重临HTTP
500荒谬。写了2个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()

4858.com 1

4858.com 2using System;
4858.com 3using System.Collections;
4858.com 4using System.ComponentModel;
4858.com 5using System.Data;
4858.com 6using System.Diagnostics;
4858.com 7using System.Web;
4858.com 8using System.Web.Services;
4858.com 9using System.Web.Services.Protocols;
4858.com 10using Microsoft.Web.Services2;
4858.com 11using Microsoft.Web.Services2.Security;
4858.com 12using Microsoft.Web.Services2.Security.Tokens;
4858.com 13
4858.com 14namespace WebTest
4858.com 154858.com 164858.com 17{
4858.com 184858.com 19    /**//// <summary>
4858.com 20    /// Sum瑟维斯 的摘要表明。
4858.com 21    /// </summary>
4858.com 22    public class SumService : System.Web.Services.WebService
4858.com 234858.com 24    4858.com 25{
4858.com 26        public SumService()
4858.com 274858.com 28        4858.com 29{
4858.com 30            //CODEGEN: 该调用是 ASP.NET Web 服务设计器所必备的
4858.com 31            InitializeComponent();
4858.com 32        }
4858.com 33
4858.com 344858.com 35        组件设计器生成的代码#region 组件设计器生成的代码
4858.com 36        
4858.com 37        //Web 服务设计器所必要的
4858.com 38        private IContainer components = null;
4858.com 39                
4858.com 404858.com 41        /**//// <summary>
4858.com 42        /// 设计器辅助所需的方法 – 不要接纳代码编辑器修改
4858.com 43        /// 此措施的剧情。
4858.com 44        /// </summary>
4858.com 45        private void InitializeComponent()
4858.com 464858.com 47        4858.com 48{
4858.com 49        }
4858.com 50
4858.com 514858.com 52        /**//// <summary>
4858.com 53        /// 清理全部正在使用的能源。
4858.com 54        /// </summary>
4858.com 55        protected override void Dispose( bool disposing )
4858.com 564858.com 57        4858.com 58{
4858.com 59            if(disposing && components != null)
4858.com 604858.com 61            4858.com 62{
4858.com 63                components.Dispose();
4858.com 64            }
4858.com 65            base.Dispose(disposing);        
4858.com 66        }
4858.com 67        
4858.com 68        #endregion
4858.com 69
4858.com 70        // WEB 服务示范
4858.com 71        // HelloWorld() 示例服务重临字符串 Hello World
4858.com 72        // 若要扭转,请废除注释下列行,然后保留并生成项目
4858.com 73        // 若要测试此 Web 服务,请按 F5 键
4858.com 74//
4858.com 75        [WebMethod]
4858.com 76        public string HelloWorld()
4858.com 774858.com 78        4858.com 79{
4858.com 80            SoapContext requestContext=RequestSoapContext.Current;
4858.com 81            if(requestContext==null)
4858.com 82                throw new ApplicationException(“Only soap request are permitted.”);
4858.com 83            return “Hello World.”;
4858.com 84        }
4858.com 85        [SoapRpcMethod(Action=”]
4858.com 86        [WebMethod]
4858.com 87        public int IntAdd(int a,int b)
4858.com 884858.com 89        4858.com 90{
4858.com 91            SoapContext requestContext=RequestSoapContext.Current;
4858.com 92            
4858.com 93            if(requestContext==null)
4858.com 94                throw new ApplicationException(“Only soap request are permitted.”);
4858.com 95            
4858.com 96
4858.com 97            return a+b;
4858.com 98        }
4858.com 99
4858.com 100        
4858.com 101    }
4858.com 102    }
4858.com 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

4858.com 104using System;
4858.com 105using Microsoft.Web.Services2;
4858.com 106using Microsoft.Web.Services2.Security;
4858.com 107using Microsoft.Web.Services2.Security.Tokens;
4858.com 108using System.Security;
4858.com 109using System.Security.Permissions;
4858.com 110
4858.com 111namespace WebTest
4858.com 1124858.com 1134858.com 114{
4858.com 1154858.com 116    /**//// <summary>
4858.com 117    /// CustomUsernameTokenManager 的摘要表达。
4858.com 118    /// </summary>
4858.com 119    [SecurityPermission(SecurityAction.Demand,
4858.com 120         Flags= SecurityPermissionFlag.UnmanagedCode)]
4858.com 121
4858.com 122    public class CustomUsernameTokenManager:UsernameTokenManager
4858.com 1234858.com 124动态编写翻译,在线运维。    4858.com 125{
4858.com 126        public CustomUsernameTokenManager()
4858.com 1274858.com 128        4858.com 129{
4858.com 130            //
4858.com 131            // TODO: 在此地添加构造函数逻辑
4858.com 132            //
4858.com 133        }
4858.com 134
4858.com 135        protected override string AuthenticateToken(UsernameToken token)
4858.com 1364858.com 137        4858.com 138{
4858.com 139            if(token==null)
4858.com 140                throw new ArgumentNullException();
4858.com 141            if(token.Username==”username”)
4858.com 142                return “password”;
4858.com 143            else
4858.com 144                return “love”;
4858.com 145            
4858.com 146//                byte[] encodedUsername=System.Text.Encoding.UTF8.GetBytes(token.Username);
4858.com 147//                if(System.Text.Encoding.UTF8.GetString(encodedUsername)==”username”)
4858.com 148//                    return “password”;
4858.com 149//            else
4858.com 150//                    return “love”;
4858.com 151
4858.com 152        }
4858.com 153
4858.com 154    }
4858.com 155}
4858.com 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。

4858.com 157<?xml version=”1.0″ encoding=”utf-8″?>
4858.com 158<configuration>
4858.com 159  <configSections>
4858.com 160    <section name=”microsoft.web.services2″ type=”Microsoft.Web.Services2.Configuration.WebServicesConfiguration, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />
4858.com 161  </configSections>
4858.com 162  <system.web>
4858.com 163    <webServices>
4858.com 164      <protocols>
4858.com 165        <remove name=”HttpGet” />
4858.com 166        <remove name=”HttpPost” />
4858.com 167      </protocols>
4858.com 168      <soapExtensionTypes>
4858.com 169        <add type=”Microsoft.Web.Services2.WebServicesExtension, Microsoft.Web.Services2, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ priority=”1″ group=”0″ />
4858.com 170      </soapExtensionTypes>
4858.com 171    </webServices>
4858.com 172    <!–  动态调节编写翻译
4858.com 173          设置 compilation debug=”true” 以启用 ASPX 调节和测试。不然,将此值设置为
4858.com 174          false 将增强此应用程序的运行时质量。
4858.com 175          设置 compilation debug=”true” 以将调节和测试符号(.pdb 音信)
4858.com 176          插入到编写翻译页中。因为那将开创执行起来
4858.com 177          较慢的大文件,所以应该只在调节和测试时将此值设置为 true,而在全数别的时候都安装为
4858.com 178          false。有关更加多音信,请参考有关
4858.com 179          调节和测试 ASP.NET 文件的文书档案。
4858.com 180    –>
4858.com 181    <compilation defaultLanguage=”c#” debug=”true” />
4858.com 182    <!–  自定义错误音信
4858.com 183          设置 customErrors mode=”On” 或 “RemoteOnly” 以启用自定义错误消息,或设置为 “Off” 以禁用自定义错误新闻。 
4858.com 184          为每种要处理的一无可取添加 <error> 标记。
4858.com 185
4858.com 186          “On” 始终展现自定义(友好的)消息。
4858.com 187          “Off” 始终展现详细的 ASP.NET 错误音信。
4858.com 188          “RemoteOnly” 只对不在本地 Web 服务器上运维的
4858.com 189           用户展示自定义(友好的)音信。出于安全目标,提出选取此设置,以便 
4858.com 190           不向远程客户端呈现应用程序的详细消息。
4858.com 191    –>
4858.com 192    <customErrors mode=”RemoteOnly” />
4858.com 193    <identity impersonate=”true” />
4858.com 194    <!–  身份验证 
4858.com 195          此节设置应用程序的身份验证策略。恐怕的情势是 “Windows”、 
4858.com 196          “Forms”、 “Passport” 和 “None”
4858.com 197
4858.com 198          “None” 不履行身份验证。 
4858.com 199          “Windows” IIS 依据应用程序的装置举行身份验证 
4858.com 200            (基本、简要或集成 Windows)。在 IIS 中务必禁止使用匿名访问。
4858.com 201          “Forms” 您为用户提供3个输入凭据的自定义窗体(Web 页),然后 
4858.com 202           在你的应用程序中表达他们的身份。用户凭据标记存储在 Cookie 中。
4858.com 203          “Passport” 身份验证是因此 Microsoft 的汇聚身份验证服务实施的,
4858.com 204           它为成员站点提供单身登录和基本配置文件服务。
4858.com 205    –>
4858.com 206    <authentication mode=”Windows” />
4858.com 207    <!–  授权 
4858.com 208           此节设置应用程序的授权策略。能够允许或拒绝分化的用户或剧中人物访问
4858.com 209          应用程序财富。通配符: “*” 表示任哪个人,”?” 表示匿名
4858.com 210          (未经身份验证的)用户。
4858.com 211    –>
4858.com 212    <authorization>
4858.com 213      <allow users=”*” />
4858.com 214      <!– 允许全体用户 –>
4858.com 215      <!–  <allow     users=”[逗号分隔的用户列表]”
4858.com 216                             roles=”[逗号分隔的剧中人物列表]”/>
4858.com 217                  <deny      users=”[逗号分隔的用户列表]”
4858.com 218                             roles=”[逗号分隔的角色列表]”/>
4858.com 219            –>
4858.com 220    </authorization>
4858.com 221    <!–  应用程序级别跟踪记录
4858.com 222          应用程序级别跟踪为应用程序中的每一页启用跟踪日志输出。
4858.com 223          设置 trace enabled=”true” 可以启用应用程序跟踪记录。倘诺 pageOutput=”true”,则
4858.com 224          在每一页的平底突显跟踪新闻。不然,能够通过浏览 Web 应用程序
4858.com 225           根目录中的 “trace.axd” 页来查看
4858.com 226          应用程序跟踪日志。
4858.com 227    –>
4858.com 228    <trace enabled=”false” requestLimit=”10″ pageOutput=”false” traceMode=”SortByTime” localOnly=”true” />
4858.com 229    <!–  会话状态设置
4858.com 230          默许境况下,ASP.NET 使用 库克ie 来标识哪些请求属于特定的对话。
4858.com 231          假若 Cookie 不可用,则能够透过将会话标识符添加到 ULANDL 来跟踪会话。
4858.com 232         若要禁止使用 库克ie,请设置 sessionState cookieless=”true”。
4858.com 233    –>
4858.com 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″ />
4858.com 235    <!–  全球化
4858.com 236          此节设置应用程序的环球化设置。
4858.com 237    –>
4858.com 238    <globalization requestEncoding=”utf-8″ responseEncoding=”utf-8″ />
4858.com 239  </system.web>
4858.com 240  <microsoft.web.services2>
4858.com 241    <diagnostics>
4858.com 242      <trace enabled=”true” input=”InputTrace.webinfo” output=”OutputTrace.webinfo” />
4858.com 243      <detailedErrors enabled=”false” />
4858.com 244    </diagnostics>
4858.com 245    <security>
4858.com 246        <securityTokenManager type=”WebTest.CustomUsernameTokenManager,WebTest” xmlns:wsse=”” qname=”wsse:UsernameToken” />
4858.com 247    </security>
4858.com 248  </microsoft.web.services2>
4858.com 249</configuration>

  CodeDomProvider只是3个抽象类而已,对于差别的程序语言,有照应的类去继续这几个抽象类,C#的正是CSharpCodeProvider类。用于编写翻译的法门有多个,方法的宣示如下

class bool([x])

回到bool 结果,if x是 False 或然不难重返False,别的重临True,bool()是int的子集(subclass)

编写翻译后重临result结果。

四 、试验的.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’\xe4\xb8\xad\xe6\x96\x87′)
6
bytearray(b’\x00\x00\x00\x00\x00′)
5
bytearray(b’\x01\x02\x03\x04\x05′)
5

 

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

 

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

再次bytearray()的事例,输出结果为
b”
b’\4858.com,xe4\xb8\xad\xe6\x96\x87′
b’\x00\x00\x00\x00\x00′
b’\x01\x02\x03\x04\x05′

4858.com 408

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

  下边用到的是CompileAssemblyFromSource,传进去首个参数是索要编写翻译的代码字符串。而第三个情势传入的参数是亟需编写翻译的代码文件名。以上四个方法都回去同四个值——叁个CompilerResults的实例。日常那一个示例能够精通编写翻译是不是因而,如果失利了不当的代码的职分,更首要的是可以赢得编写翻译成功的先后集。当编写翻译成功之后,要么就经过反射来调用生成好的事物,要么就直接打开进度去执行exe。

callabel(object)

可怜处理:借使编写翻译时发出错误,生成错误编号和错误文本音讯并赶回给前端。

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

  那么地方还有叁个方法没介绍,那么些办法的参数是CodeCompileUnit,那些类MSDN上的分解是为
CodeDOM
程序图形提供容器。但个人感觉它能够说是3个代码的构造器,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()

类装饰器

4858.com 481

 

@staticmethod()

静态方法

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

  上边代码小编认为的主要在于构造CodeCompileUnit,在MSDN上对GenerateCodeFromCompileUnit的讲述是:基于包涵在 CodeCompileUnit 对象的内定数组中的 System.CodeDom 树,使用钦命的编写翻译器设置编写翻译程序集。那里有个DOM笔者纪念了JS对HTML的DOM树,可是在构造整个CodeCompileUnit过程中,也感到到树的层次结构,1个code文件之中有多少个命名空间,命名空间里面又有三种类型(类,接口,委托),类型里面又富含各自的成员(字段,属性,方法),方法里面含有了讲话,语句里面又带有了说明式。

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

这么些函数用来编写翻译一段字符串的源码,结果能够生成字节码恐怕AST(抽像语法树),字节码能够利用函数exec()来实施,而AST能够选拔eval()来继续编写翻译。

  • 参数source是一串字符串的源码,只怕是AST对象数组。
  • 参数filename是读取字符串的文本对象,如果不是从文件里读取源码来编译,那么那里能够放一些用来标识那个代码的字符串。
  • 参数mode是用来指明那种表示的源码类型;倘使是exec类型,表示那是一个体系语句,能够拓展运营;如若是eval类型,表示那是2个纯粹的说明式语句,能够用来计量相应的值出来;若是是single类型,表示这是二个十足语句,采纳互动方式举办,在这种景观下,假若是2个表达式,一般会输出结果,而不是打字与印刷为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)

归来结果。

4858.com 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小程序

4858.com 483

 

打响运转示例

4858.com 484

 

谬误运营示例,报错消息呈现。

4858.com 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中。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有