最后CodeDom,CodeDom可以在运行时直接生成一个Type。CodeDom生成Type主要分成3步。 参考 MSDN CodeDom
当然,我们可以把代码看成字符串而直接修改,但是这种做法也未免太生硬了,能解决的问题有限;而另一个方式就是CodeDom。 CodeDom是强大的! 我们感谢微软,给我们提供了强大的描述面向对象语言的框架;我们感谢微软,给我们提供了能够根据CodeDom生成代码或者程序集的CodeDomProvider;可惜微软没有给我们提供能够从object或者代码生成 CodeDom的能力。 关于CodeDom的知识本文不过多涉及、感兴趣的童鞋可以阅读MSDN或者博客园的其它文章学习了解。本系列期望解决的问题就是如何将对象或者代码生成CodeDom。 这是本系列的第一篇文章,如何让一个Component对象生成CodeDom。
(System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) [0x00168] in <13231d2f854e4437bf639e10b63dd37e >:0 at Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromFileBatch (System.CodeDom.Compiler.CompilerParameters \packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props \packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.3\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props Microsoft.Net.Compilers 三、解决办法 #通过nuget卸载这两个package即可 uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
cn = new System.CodeDom.CodeNamespace(@namespace); System.CodeDom.CodeCompileUnit ccu = new System.CodeDom.CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider(); System.CodeDom.Compiler.ICodeCompiler icc = csc.CreateCompiler(); System.CodeDom.Compiler.CompilerParameters cplist = new System.CodeDom.Compiler.CompilerParameters(); cplist.GenerateExecutable = false;
assemblies> </compilation> <httpRuntime targetFramework="4.6.1"/> </system.web> <system.codedom > <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform.CSharpCodeProvider , Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken , Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform, Version=1.0.5.0, Culture=neutral, PublicKeyToken langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/> </compilers> </system.codedom
[第1篇] 通过CodeDOM定义生成代码的结构 我不知道大家对CodeDOM的代码生成机制是否熟悉,但是有一点可以确定:如果你使用过Visual Studio,你就应该体验过它带给我们在编程上的便利。 CodeDOM 提供了表示许多常见的源代码元素类型的类型。您可以设计一个生成源代码模型的程序,使用CodeDOM 元素构成一个对象图。 在这里我不会具体介绍CodeDOM体系结构……[阅读全文] [第2篇] 通过Visual Studio的Custom Tool定义代码生成器 在《前篇》中我们已经通过CodeDOM的形式定义了将要生成的代码结构 ,而这个CodeDOM对象就是CodeCompileUnit。 为了实现同VS的集成,还涉及到相应注册表设置……[阅读全文] [第3篇] 不同于CodeDOM的代码生成机制——T4 前面两篇介绍了如何通过CodeDOM+Custom Tool的代码生成方式实现了代码的自动生成
\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props 离线下载:https://www.nuget.org/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform
IronPython CodeDomProvider(添加的位置似乎有讲究,如高亮部分所示): </providers> </roleManager> </system.web> <system.codedom > <compilers> <compiler language="py;IronPython" extension=".py" type="IronPython.<em>CodeDom</em>.PythonProvider IronPython, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> </compilers> </system.codedom
System.Linq; using System.Text; using System.Net; using System.Web.Services.Description; using System.CodeDom ; using Microsoft.CSharp; using System.CodeDom.Compiler; using System.IO; namespace IBO.XJMYQP.Utility System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError
我不知道大家对CodeDOM的代码生成机制是否熟悉,但是有一点可以确定:如果你使用过Visual Studio,你就应该体验过它带给我们在编程上的便利。 第一个步骤可以通过CodeDOM轻松实现,而第二个步骤借助于VS的扩展也会很简单。本篇文章我们只关注第一个方面,下面我们在对第二个方面进行介绍。 二、通过CodeDom实现动态代码生成 CodeDOM 提供了表示许多常见的源代码元素类型的类型。您可以设计一个生成源代码模型的程序,使用CodeDOM 元素构成一个对象图。 在这里我不会具体介绍CodeDOM体系结构,有兴趣的读者可以参与MSDN官方文档。 CodeDOM最终体现出来的是一个叫做CodeCompileUnit对象,这个对象通过如下定义的MessageCodeGnerator的BuildCodeObject方法返回。
using Microsoft.CSharp; using System; using System.CodeDom; using System.CodeDom.Compiler; using System.Collections.Generic cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError
为了让编译器用上3.5,我们可以在Web.config配置编译器信息: <system.codedom> <compilers> <compiler language="c#; providerOption name="WarnAsError" value="false" /> </compiler> </compilers> </system.codedom
[System.Runtime.Serialization.EnumMemberAttribute()] Rainy = 3, } [System.CodeDom.Compiler.GeneratedCodeAttribute { this.SpeedField = value; } } } [System.CodeDom.Compiler.GeneratedCodeAttribute Part I:Data Contract [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", Part II Service Contract [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0 Part III Proxy [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
使用 CodeDom 动态创建客户端代理类程序集。 5. 利用反射调用相关 WebService 方法。 OK,看看具体的例子。 使用 CodeDom 编译客户端代理类。 CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间,缺省为全局空间。 using System.IO; using System.Net; using System.CodeDom; using System.CodeDom.Compiler; using System.Web.Services 使用 CodeDom 编译客户端代理类。 CodeNamespace nmspace = new CodeNamespace(); // 为代理类添加命名空间,缺省为全局空间。 using System.IO; using System.Net; using System.CodeDom; using System.CodeDom.Compiler; using System.Web.Services
code was auto-generated by xsd, Version=4.0.30319.1. 15 // 16 17 18 /// <remarks/> 19 [System.CodeDom.Compiler.GeneratedCodeAttribute this.pARTINFOField = value; 51 } 52 } 53 } 54 55 /// <remarks/> 56 [System.CodeDom.Compiler.GeneratedCodeAttribute this.aWBNOField = value; 86 } 87 } 88 } 89 90 /// <remarks/> 91 [System.CodeDom.Compiler.GeneratedCodeAttribute this.cityField = value; 130 } 131 } 132 } 133 134 /// <remarks/> 135 [System.CodeDom.Compiler.GeneratedCodeAttribute this.aDDRESSField = value; 163 } 164 } 165 } 166 167 /// <remarks/> 168 [System.CodeDom.Compiler.GeneratedCodeAttribute
true" targetFramework="4.6.2"/> <httpRuntime targetFramework="4.6.2"/> </system.web> 编译器信息 <system.codedom > <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform.CSharpCodeProvider , Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/> </compilers> </system.codedom
targetFramework="4.6.2"/> <httpRuntime targetFramework="4.6.2"/> </system.web> 编译器信息 <system.codedom > <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform.CSharpCodeProvider , Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/> </compilers> </system.codedom
之前写了一些关于代码生成的文章,提供了两种不同方式的代码生成解决方案,即CodeDOM+Custom Tool和T4。对于ASP.NET应用,你还有第三种选择——自定义BuildProvider。 二、将XML表示的消息转换成VB.NET或者C#代码 三、将XML转换成CodeDOM 四、自定义BuildProvider 五、BuildProvider的应用 一 ", "Confirmation"); 8: } 9: } 三、将XML转换成CodeDOM 实际BuildProvider也是采用CodeDOM来定义代码的结构,在这之前我已经创建了一个 因为从XML到CodeDOM的转换已经实现在了上面的CodeGenerator类中,MessageBuildProvider的定义很简单。 由于CodeDOM的语言无关性,你也可以将MessageBuildProvider用于基于VB.NET的ASP.NET应用。 ?
Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/> </httpModules> </system.web> <system.codedom > <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform.CSharpCodeProvider , Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken , Microsoft.<em>CodeDom</em>.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken "/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/> </compilers> </system.codedom
为了解决这个问题,.Net Framework定义了一个对象模型叫做代码文档对象模型(CodeDOM),所有的原始代码能本质上分解为原始的元素的组合,而且 CodeDOM 是那些元素的对象模型.当代码依附在 CodeDOM, 生成的对象模型能够给不同语言的代码生成器生成适当的代码。 The CodeDomDesignerLoader is a full loader that works by reading and writing CodeDOM. CodeDomDesignerLoader是一个通过CodeDom进行读写支持的全功能的加载器。它是设计者加载器, 因而你所需要做全部的是CodeDomProvider. 示例应用中你可以选择菜单File | Type | CodeDomDesigner-Loader来看CodeDom的实做例子。