DotNet探密 之: CodeDOM [代码文档对象模型]

智能体在车联网中的应用:第19天 智能体理论与初步实践 D30:阶段小结——在SUMO中使用TraCI控制预编程智能体 本文介绍了如何将强化学习从算法仿真迁移到交通系统实践,重点讲解了SUMO微观交通仿真平台与TraCI实时控制接口的架构。通过构建一个预编程驾驶智能体,演示了车辆从起点到目标点的导航控制。文章详细解析了TraCI的双向通信机制和事件驱动模型,对比了其与传统RL环境的差异,并提供了完整的Python实现框架,包括路网配置、车辆控制和基于向量场的导航逻辑。该实践为后续开发高级学习型交通智能体奠定了基础。 阅读详情
[原创] DotNet探密 之: CodeDOM [代码文档对象模型]

DotNet探密之:闲言                                       
        使用Microsoft .NET已经有些时候了,越深入的研究就越加发觉Microsoft .NET的一些有趣的特性,时常会想,                                                               
大家知道它的这些语言特性吗,是不是也象我一样,在MSDN.NET的星空里寻找散落的繁星呢?有感于此,                                                                       
所以决定把自己的一些学习心得共享,第一次写这么长的技术文章,估计有点罗嗦,欢迎大家拍砖斧正^-^                                                                       
                                [原创] DotNet探密 之: CodeDOM [代码文档对象模型]                                       
一:什么是CodeDOM和CodeDOM可以实现的功能:                                                                       
        MSDN.NET2003中是这样描叙CodeDOM的:“CodeDOM 提供了表示许多常见的源代码元素类型的类型。您可以设计                                                               
一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。可以使用受支持的编程语言的 CodeDOM 代码生成器,                                                                       
将该对象图呈现为源代码。CodeDOM也可以用于将源代码编译成二进制程序集。”                                                                       
        这个不但是CodeDOM的定义,也说明了CodeDom功用:                                                               
        <一>:提供了表示许多常见的源代码元素类型的类型。                                                               
        <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。                                                               
        <三>:可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。                                                               
        <四>:CodeDOM也可以用于将源代码编译成二进制程序集。                                                               
        我们来一一分析一下:                                                               
        “<一>:提供了表示许多常见的源代码元素类型的类型。” :大家知道“常见的源代码元素类型”在.NET这样完全面       
向对象的框架里,无非就是指名称空间/类/方法/属性了吧,那么“源代码元素类型的类型”又是什么呢?               
        “<二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。”:刚才说的是源代码元素类型       
的类型,那么这个是不是说可以根据这些类型之间的关系来生成对象图呢?是的话,又如何实现的呢?               
        “<三>:可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。”:这里主要提到了可以       
通过CodeDOM 代码生成器将生成的对象图呈现为源代码,并且可以生成所支持的源代码,比如说C#,比如说VB.NET,               
如果Delphi.NET支持了,那么也可以生成。               
        “<四>:CodeDOM也可以用于将源代码编译成二进制程序集。”:意思是说可以通过CodeDOM来编译运行所生成的       
源代码,那么CodeDOM如何实现的呢?               
        带着上面的疑问,我们进入下一节,慢慢来体会CodeDOM的精髓:       

二:CodeDOM中表示源代码元素的类型及其应用:               
        因为CodeDOM中有对应常见源代码元素类型的类型,所以CodeDOM应该拥有庞大的对象群。而正是它庞大的对象群,       
常让设计开发人员有种无从下手的感觉,但是一旦了解了,就会发现其实这些对象的用法还是相当直观的。               
        I:CodeCompileUnit 和 CodeNamespace:       
CodeCompileUnit是CodeDOM中的根容器型对象,它可以加入CodeNamespace来生成namespace语句。如下程序演示了此用法。               
运用CodeCompileUnit对象的例子:                        
      
 using System;                
        
using System.IO;                
        
using System.CodeDom;                
        
using System.CodeDom.Compiler;                

        
namespace TestCodeDOM_01                
        
{                

                
class TestCodeDOM        
                
{        

                        [STAThread]
                        
static void Main(string[] args)
                        
{

                                CodeCompileUnit CompileUnit 
= CodeDOMTest();

                                StringWriter SWriter 
= null; 
                                SWriter 
= GetCodeDOMSource( CompileUnit, "CSharp" );
                                
//SWriter = GetCodeDOMSource( CompileUnit, "VisualBasic" );

                                Console.ReadLine();
                        }
        

                        
/*        
                         * CodeDOM测试函数:        
                         * 演示 <一>:提供了表示许多常见的源代码元素类型的类型。        
                         * 演示 <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。        
                         
*/
        
                        
private static CodeCompileUnit CodeDOMTest()        
                        
{        
                                CodeCompileUnit CompileUnit 
= new CodeCompileUnit();        
                                CodeNamespace   CNameSpace
= new CodeNamespace("CodeDOMSpace");        
                                
try        
                                
{        
                                        CompileUnit.Namespaces.Add( CNameSpace);
                                }
        
                                
catch        
                                
{        
                                        
throw new Exception("CodeDOM出错!");
                                }
        

                                
return CompileUnit;        
                        }
                

                        
/*                
                         * C根据CodeCompileUnit生成源代码,并且放到StringWriter中:                
                         * 演示  <三>:可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。                        
                         
*/
                        
                        
private static StringWriter GetCodeDOMSource(CodeCompileUnit CompileUnit, String sProviderType)                        
                        
{                        
                                StringWriter SWriter 
= new StringWriter();                

                                CodeDomProvider CProvider 
= null;                

                                
switch ( sProviderType )                
                                
{                
                                        
case "CSharp" :        
                                                CProvider 
= new Microsoft.CSharp.CSharpCodeProvider(); 
                                                
break;
                                        
case "VisualBasic" :        
                                                CProvider 
= new Microsoft.VisualBasic.VBCodeProvider();
                                                
break;
                                        
default:                                
                                                
throw new Exception( "参数错误!" );                        
                                }
                                        

                                ICodeGenerator Generator 
= CProvider.CreateGenerator();                                        
                                Generator.GenerateCodeFromCompileUnit( CompileUnit,SWriter,
new CodeGeneratorOptions() );                                        
                                Console.Write( SWriter.ToString() );                                        
                                
return SWriter;                                        
                                                                                
                        }
                                                
                }
                                                        
        }
 

运行结果就不输出了,大家可以自己去看看。该程序还演示了CodeDOM的                                                                       
        <一>:提供了表示许多常见的源代码元素类型的类型。                                                               
        <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。                                                               
        <三>:可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。                                                               
是怎么实现的。                                                       

        II:CodeNamespaceImport 和 CodeTypeDeclaration:                                               
CodeNamespaceImport 对象用来生成namespace引用的代码: using XXX。但是2003下的.NET框架只支持名称空间下的namespace                                                       
引用。也就是说只允许来加入CodeNamespace来加入CodeNamespaceImport.                                                       
CodeTypeDeclaration是处理类、结构或枚举的类型声明的对象,它也只能由CodeNamespace来加入。                                                       
        我们修改如上给出代码的CodeDOMTest()函数,别的代码不变:                                                
       
 /*                                                
         * CodeDOM测试函数:                                                
         * 演示 <一>:提供了表示许多常见的源代码元素类型的类型。                                                
         * 演示 <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。                                                
         
*/
                                                
        
private static CodeCompileUnit CodeDOMTest()                                                
        
{                                                
                CodeCompileUnit CompileUnit 
= new CodeCompileUnit();                                        
                CodeNamespace   CNameSpace 
= new CodeNamespace("CodeDOMSpace");                                        
                
try        
                
{        
                        
//新添加的代码Begin
                        CNameSpace.Imports.Add(new CodeNamespaceImport("System"));
                        CNameSpace.Imports.Add(
new CodeNamespaceImport("System.IO"));

                        CodeTypeDeclaration CClass 
= new CodeTypeDeclaration( "CodeDOMClass" );
                        CNameSpace.Types.Add( CClass );

                        CodeTypeDeclaration CInterFace 
= new CodeTypeDeclaration( "CodeDOMInterFace" );
                        CInterFace.IsInterface 
= true;
                        CNameSpace.Types.Add( CInterFace );
                        
//新添加的代码End
                        CompileUnit.Namespaces.Add( CNameSpace );

                }
        
                
catch                                
                
{                                
                        
throw new Exception("CodeDOM出错!");                        
                }
                                

                
return CompileUnit;                                
        }
                                        
        类型当然需要指定了,如下代码演示了如何实现抽象类和定义该抽象类为protected:                                        
        
CodeTypeDeclaration CAbstractClass = new CodeTypeDeclaration( "CodeDOMAbstractClass" );                                        
CAbstractClass.TypeAttributes 
= System.Reflection.TypeAttributes.Abstract |                                        
                                                   System.Reflection.TypeAttributes.Public;

 CNameSpace.Types.Add( CAbstractClass );             
                           
        如下为所有System.Reflection.TypeAttributes的可能值:                                        
        
public enum System.Reflection.TypeAttributes                                         
        
{
            Abstract 
= 0x00000080, 
            AnsiClass 
= 0x00000000, 
            AutoClass 
= 0x00020000, 
            AutoLayout 
= 0x00000000, 
            BeforeFieldInit 
= 0x00100000, 
            Class 
= 0x00000000, 
            ClassSemanticsMask 
= 0x00000020, 
            ExplicitLayout 
= 0x00000010, 
            HasSecurity 
= 0x00040000, 
            Import 
= 0x00001000, 
            Interface 
= 0x00000020, 
            LayoutMask 
= 0x00000018, 
            NestedAssembly 
= 0x00000005, 
            NestedFamANDAssem 
= 0x00000006, 
            NestedFamily 
= 0x00000004, 
            NestedFamORAssem 
= 0x00000007, 
            NestedPrivate 
= 0x00000003, 
            NestedPublic 
= 0x00000002, 
            NotPublic 
= 0x00000000, 
            Public 
= 0x00000001, 
            ReservedMask 
= 0x00040800, 
            RTSpecialName 
= 0x00000800, 
            Sealed 
= 0x00000100, 
            SequentialLayout 
= 0x00000008, 
            Serializable 
= 0x00002000, 
            SpecialName 
= 0x00000400, 
            StringFormatMask 
= 0x00030000, 
            UnicodeClass 
= 0x00010000, 
            VisibilityMask 
= 0x00000007, 
        }
        如下代码演示了如何定义类型的父类:
        
CClass.BaseTypes.Add( new CodeTypeReference( typeof(System.IO.File) ) );       
         
        至此,CodeDOMTest()函数变为了如下:                
        
using System;                
        
using System.IO;                
        
using System.CodeDom;                
        
using System.CodeDom.Compiler;                

        
namespace TestCodeDOM_01                
        
{                

                
class TestCodeDOM        
                
{        

                        [STAThread]
                        
static void Main(string[] args)
                        
{

                                CodeCompileUnit CompileUnit 
= CodeDOMTest();

                                StringWriter SWriter 
= null; 
                                SWriter 
= GetCodeDOMSource( CompileUnit, "CSharp" );
                                
//SWriter = GetCodeDOMSource( CompileUnit, "VisualBasic" );

                                Console.ReadLine();
                        }
        

                        
/*        
                         * CodeDOM测试函数:        
                         * 演示 <一>:提供了表示许多常见的源代码元素类型的类型。        
                         * 演示 <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。        
                         
*/
        
                        
private static CodeCompileUnit CodeDOMTest()        
                        
{                
                                CodeCompileUnit CompileUnit 
= new CodeCompileUnit();        
                                CodeNamespace   CNameSpace 
= new CodeNamespace("CodeDOMSpace");        
                                
try        
                                
{        

                                        CNameSpace.Imports.Add(
new CodeNamespaceImport("System"));
                                        CNameSpace.Imports.Add(
new CodeNamespaceImport("System.IO"));

                                        CodeTypeDeclaration CClass 
= new CodeTypeDeclaration( "CodeDOMClass" );
                                        CClass.BaseTypes.Add( 
new CodeTypeReference( typeof(System.IO.File) ) );
                                        CNameSpace.Types.Add( CClass );

                                        CodeTypeDeclaration CInterFace 
= new CodeTypeDeclaration( "CodeDOMInterFace" );
                                        CInterFace.IsInterface 
= true;
                                        CNameSpace.Types.Add( CInterFace );

                                        CodeTypeDeclaration CAbstractClass 
= new CodeTypeDeclaration( "CodeDOMAbstractClass" );                                                                
                                        CAbstractClass.TypeAttributes 
= System.Reflection.TypeAttributes.Abstract |                                                                
                                                                                                        System.Reflection.TypeAttributes.Public;
                                        CNameSpace.Types.Add( CAbstractClass );                                                                

                                        CompileUnit.Namespaces.Add( CNameSpace );                                                                

                                }
                                                                        
                                
catch                                                                        
                                
{                                                                        
                                        
throw new Exception("CodeDOM出错!");                                                                
                                }
                                                                        

                                
return CompileUnit;                                                                        
                        }
                                                                                

                        
/*                        
                         * C根据CodeCompileUnit生成源代码,并且放到StringWriter中:                        
                         * 演示  <三>:可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。                        
                         
*/
                        
                        
private static StringWriter GetCodeDOMSource( CodeCompileUnit CompileUnit, String sProviderType )                        
                        
{                        
                                StringWriter SWriter 
= new StringWriter();                

                                CodeDomProvider CProvider 
= null;                

                                
switch ( sProviderType )                
                                
{                
                                        
case "CSharp" :        
                                                CProvider 
= new Microsoft.CSharp.CSharpCodeProvider(); 
                                                
break;
                                        
case "VisualBasic" :        
                                                CProvider 
= new Microsoft.VisualBasic.VBCodeProvider();
                                                
break;
                                        
default:        
                                                
throw new Exception( "参数错误!" );
                                }
                

                                ICodeGenerator Generator 
= CProvider.CreateGenerator();                
                                Generator.GenerateCodeFromCompileUnit( CompileUnit,SWriter,
new CodeGeneratorOptions() );                
                                Console.Write( SWriter.ToString() );                
                                
return SWriter;                
                                                        
                        }
                        
                }
                                
        }
                                        

        运行结果如下:

        III:CodeMemberField,CodeMemberMethod,CodeMemberProperty,CodeMemberEvent                                                               
        CodeMemberField,CodeMemberMethod,CodeMemberProperty,CodeMemberEvent是产生成员函数,成员变量,成员事件,                                                               
成员属性的对象,而且必须要由CodeTypeDeclaration.Members对象来加入。                                                                       
        那么我们再次对 CodeDOMTest() 函数进行修改:                                                                
        
/*                                                                
         * CodeDOM测试函数:                                                                
         * 演示 <一>:提供了表示许多常见的源代码元素类型的类型。                                                                
         * 演示 <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。                
         
*/
                
        
private static CodeCompileUnit CodeDOMTest()                
        
{                
                CodeCompileUnit CompileUnit 
= new CodeCompileUnit();        
                CodeNamespace   CNameSpace 
= new CodeNamespace("CodeDOMSpace");        
                
try        
                
{        

                        CNameSpace.Imports.Add(
new CodeNamespaceImport("System"));
                        CNameSpace.Imports.Add(
new CodeNamespaceImport("System.IO"));

                        CodeTypeDeclaration CClass 
= new CodeTypeDeclaration( "CodeDOMClass" );
                        CClass.BaseTypes.Add( 
new CodeTypeReference( typeof(System.IO.File) ) );
                        CNameSpace.Types.Add( CClass );

                        CodeTypeDeclaration CInterFace 
= new CodeTypeDeclaration( "CodeDOMInterFace" );        
                        CInterFace.IsInterface 
= true;        
                        CNameSpace.Types.Add( CInterFace );        

                        CodeTypeDeclaration CAbstractClass 
= new CodeTypeDeclaration( "CodeDOMAbstractClass" );        
                        CAbstractClass.TypeAttributes 
= System.Reflection.TypeAttributes.Abstract |        
                                System.Reflection.TypeAttributes.Public;
                        CNameSpace.Types.Add( CAbstractClass );        

                        CodeTypeDeclaration CMethodClass 
= new CodeTypeDeclaration( "CodeDOMMethedClass" );        

                        CodeMemberField CField 
= new CodeMemberField( typeof(int),"iTemp");        

                        CodeMemberMethod CMethod 
= new CodeMemberMethod();        
                        CMethod.Name 
= "TestMethod";        
                        CMethod.ReturnType 
= new CodeTypeReference( typeof(string) );        
                        CMethod.Parameters.Add(                                                
                                
new CodeParameterDeclarationExpression( typeof(int), "InputInt")        );                                
                        CMethod.Statements.Add( 
new CodeMethodReturnStatement(                                                
                                                        
new CodePrimitiveExpression("Hello World!") ));                

                        CodeMemberProperty CMProperty 
= new CodeMemberProperty();                                                
                        CMProperty.Name 
= "ITemp";                                                
                        CMProperty.HasGet 
= true;                                                
                        CMProperty.Type 
= new CodeTypeReference( typeof(int) );                                                
                        CMProperty.GetStatements.Add(        
new CodeMethodReturnStatement(                                        
                                                                        
new CodeFieldReferenceExpression(
                                                                        
new CodeThisReferenceExpression(), "iTemp")));

                        CMethodClass.Members.Add(CField);                                                
                        CMethodClass.Members.Add(CMethod);                                                
                        CMethodClass.Members.Add(CMProperty);                                                

                        CNameSpace.Types.Add( CMethodClass );

                        CompileUnit.Namespaces.Add( CNameSpace );

                }
        
                
catch        
                
{        
                        
throw new Exception("CodeDOM出错!");
                }
        

                
return CompileUnit;        
        }
                
        CodeMemberField,CodeMemberProperty没什么可讲的,大体应用上面都有了,着重说一下CodeMemberMethod吧。               
        首先Create一个表示事件的对象:               
        CodeMemberMethod CMethod = new CodeMemberMethod();
        然后给出事件名字:
        CMethod.Name = "TestMethod";
        然后就是函数的返回值如何给了:

        public CodeTypeReference ReturnType { get; set; }
        而CodeMemberMethod的返回值是CodeTypeReference类型
        所以需要如下给出:
        CMethod.ReturnType = new CodeTypeReference( typeof(string) );

        函数的参数添加如下:
        CMethod.Parameters.Add( new CodeParameterDeclarationExpression( typeof(string), "AString") );


        函数的返回值添加如下:
        CMethod.Statements.Add( new CodeMethodReturnStatement(
                                                        new CodePrimitiveExpression("Hello World!") ));

三:CodeDOM如何编译生成的源代码:                                                       
        在名称空间里再加入一个带有入口函数Main的类:                                                

        
CodeTypeDeclaration MainClass = new CodeTypeDeclaration("MainClass");//定义一个名为DemoClass的类                                                 
        CodeEntryPointMethod Start = new CodeEntryPointMethod();             //定义程序入口点,就是Main()                                                 
        
//下面两句产生调用方法的语句                                                 
        
//这句会产生如下的C#代码 System.Console.WriteLine("Hello World!");                                                 
        CodeMethodInvokeExpression CMDInvoke_1 = new CodeMethodInvokeExpression(                                                
                
new CodeTypeReferenceExpression("System.Console"),                                         
                WriteLine,
new CodePrimitiveExpression("Hello World!"));                                        

        
//这句是 System.Console.Read();                                                 
        CodeMethodInvokeExpression CMDInvoke_2 = new CodeMethodInvokeExpression(                                                
                
new CodeTypeReferenceExpression("System.Console"),                                         
                Read);
        MainClass.Members.Add( Start );         
        Start.Statements.Add( CMDInvoke_1 );         
        Start.Statements.Add( CMDInvoke_2 );         

        CNameSpace.Types.Add( MainClass );        

        然后加一个编译的函数CompileCode,这个就很简单了,见下面代码。       


        为了编译生成的源代码,我们重构了之前的代码,我给出主要的结构函数吧:        
       
 /*        
        * 编译生成的源代码:        
        * <四>:CodeDOM也可以用于将源代码编译成二进制程序集。        
        
*/
        
        
public static CompilerResults CompileCode( CodeDomProvider CProvider, string SourcePath )         
        
{                 

                ICodeCompiler ICompiler 
= ((Microsoft.CSharp.CSharpCodeProvider)CProvider).CreateCompiler();         

                
//编译参数         
                CompilerParameters CParameters = new CompilerParameters(         
                        
new string[] {"System.dll"},
                        SourcePath.Substring( 
0,SourcePath.LastIndexOf(".") + 1 ) + "exe",
                        
false); 

                CParameters.GenerateExecutable 
= true; //生成exe        

                CompilerResults CResult 
= ICompiler.CompileAssemblyFromFile( CParameters,SourcePath );         

                
return CResult;         
        }
                 


        
/*                
         * 根据CodeCompileUnit生成源代码,并且放到StreamWrite中,并保存到文件:                
         * 演示  <三>:可以使用受支持的编程语言的 CodeDOM 代码生成器,将该对象图呈现为源代码。                
         
*/
                
        
private static void GetCodeDOMSource( CodeCompileUnit CompileUnit, String sProviderType )                
        
{                
                
string SourcePath =  "CodeDOMTest.cs";        
                StreamWriter StreamW 
= new StreamWriter( SourcePath,false); //New Insert        

                CodeDomProvider CProvider 
= null;        

                
switch ( sProviderType )        
                
{        
                        
case "CSharp" :
                                CProvider 
= new Microsoft.CSharp.CSharpCodeProvider(); 
                                
break;
                        
case "VisualBasic" :        
                                CProvider 
= new Microsoft.VisualBasic.VBCodeProvider();
                                
break;
                        
default:        
                                
throw new Exception( "参数错误!" );
                }
                

                ICodeGenerator Generator 
= CProvider.CreateGenerator();                
                
try                
                
{                
                        Generator.GenerateCodeFromCompileUnit( CompileUnit,StreamW,
new CodeGeneratorOptions() ); //New Insert        
                        StreamW.Close();        
                        CompileCode( CProvider, SourcePath );         
                }
                
                
catch(Exception e)        
                
{        
                        
throw new Exception(e.Message);
                }
                
        }
                

        
/*                
         * CodeDOM测试函数:                
         * 演示 <一>:提供了表示许多常见的源代码元素类型的类型。                
         * 演示 <二>:可以设计一个生成源代码模型的程序,使用 CodeDOM 元素构成一个对象图。                
         
*/
                
        
private static CodeCompileUnit CodeDOMTest()                
        
{                
                CodeCompileUnit CompileUnit 
= new CodeCompileUnit();        
                CodeNamespace   CNameSpace 
= new CodeNamespace("CodeDOMSpace");        
                
try        
                
{                

                        CodeTypeDeclaration MainClass 
= new CodeTypeDeclaration("MainClass");//定义一个名为DemoClass的类         
                        CodeEntryPointMethod Start = new CodeEntryPointMethod();           //定义程序入口点,就是Main()         
                        
//下面两句产生调用方法的语句         
                        
//这句会产生如下的C#代码 System.Console.WriteLine("Hello World!");         
                        CodeMethodInvokeExpression CMDInvoke_1 = new CodeMethodInvokeExpression(        
                                
new CodeTypeReferenceExpression("System.Console"), 
                                WriteLine,
new CodePrimitiveExpression("Hello World!"));

                        
//这句是 System.Console.Read();         
                        CodeMethodInvokeExpression CMDInvoke_2 = new CodeMethodInvokeExpression(        
                                
new CodeTypeReferenceExpression("System.Console"), 
                                ReadLine);
                        MainClass.Members.Add( Start );         
                        Start.Statements.Add( CMDInvoke_1 );         
                        Start.Statements.Add( CMDInvoke_2 ); 

                        CNameSpace.Types.Add( MainClass );

                        CompileUnit.Namespaces.Add( CNameSpace );
                }
        
                
catch        
                
{        
                        
throw new Exception("CodeDOM出错!");
                }
        
                
return CompileUnit;        
        }
                

        使用:                
        CodeCompileUnit CompileUnit 
= CodeDOMTest();                
        GetCodeDOMSource( CompileUnit, 
"CSharp" );                
        GetCodeDOMSource( CompileUnit, 
"VisualBasic" );        

        编译之后,就会在Debug目录下有两个EXE文件,一个是本程序的,一个是CodeDOM编译源代码生成的。       

        到此CodeDOM的技术就讲完了,根据CodeDOM我们可以写自己的代码解析器,事实上有人已经做了^-^       

        参考资料:       
                MSDN.NET2003
                深入解剖分析ASP.NET组件设计 黄忠诚
  
 
MFC C++ 中实现跨平台(WindowsLinux)的远程桌面控制 **输入捕获**:在显示窗口中捕获鼠标/键盘事件(重写 `OnLButtonDown`、`OnMouseMove`、`OnKeyDown` 等),将事件坐标/键值通过网络发送到服务端。- **显示窗口**:使用 `CStatic` 或自定义 `CWnd` 派生类显示远程桌面图像(通过 `StretchDIBits` 绘制解压后的像素数据)。// 转换为相对坐标。- **Wayland 支持**:需使用 `libweston` 或 `xdg-desktop-portal`,较复杂,建议优先支持 X11。 阅读详情

相关推荐

VisionMaster图像源模块的5个隐藏功能:从自动切换到二次开发接口

本文深入解析了VisionMaster图像源模块的5个隐藏功能,从基础的自动切换与字符触发过滤,到高级的脚本扩展与基于COM组件的二次开发接口。这些功能能显著提升工业视觉项目的自动化水平、灵活性与系统集成能力,帮助开发者实现更高效的离线测试流水线和外部精确控制。

rgv23456789的博客 652

DotNet控件开发的资料

 控件开发的资料          我是从Delphi入行的,自来对控件开发就有种特殊的爱好,认为但凡快速开发的IDE集成开发环境,了解了控件开发也就了解了其IDE的精髓所在[当然Eclipse就是插件开发了]!孜孜不倦的学习研究和Delphi的VCL代码中,试着用Delphi,BCB来重构和开发自己实际需要的可视和非可视控件,常常乐此不疲.           Dot.Net的开发使用,是从

5644

持续集成介绍及Jenkins自动化测试部署

学习持续集成及jenkins的自动化测试部署

ouihsiad的博客 4579

OOP之多态 【C#】

======================================================其实这篇文章是我整理出来的一篇讲稿,关于C#的资料中多态的描述很匮乏,包括别的语言[Java,C++]也是。我是Delphi程序员出身的,很庆幸关于多态的论述在Delphi的著作中有很多,所以我是参考Delphi资料,再加上自己对C#的理解整理的,纰漏之处,请见谅!   

4673

图像去模糊(二)——Richardson–Lucy算法

Richardson Lucy Algorithm(Richardson-Lucy算法详解及效果实例)

xueruhongchen的博客 3万+

SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2))

创建订单样例代码参见:http://blog.youkuaiyun.com/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010

SAP BLOG--Jack Wu 6227

AspNet2.0页面生命周期

AspNet2.0页面生命周期 页面框架通过如下过程处理aspx文件请求:    1:解析aspx文件,并创建一个控件树;    2:使用控件树动态实现一个继承自Page类的类或者控件 ;    3:动态编译类;    4:缓存编译类,以备后用;    5:动态创建一个编译类的实例。页面开始启动生命期,在这个过程中,页面将通过生命周期的不同阶段;========================

4383

java爬虫(爬取银行理财数据)

import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; imp

ROCK 2491

OOP之封装 【C#】

前言         最近大富翁论坛引发了一场辩论,其实所讨论的就是OO中的封装,大家可以去看看。         Url:http://www.delphibbs.com/delphibbs/dispq.asp?lid=3903096         封装是OO的三要素之一,也是隔离变化最实用的技巧之一。 一:封装的概念         可以把程序按某种规则分成很多“块“,块与块之间可能会有联系

1631

Android 自动亮度

/则需要从BrightnessConfigure类中读取两个数组源:config_autoBrightnessLevels和config_autoBrightnessDisplayValuesNits。) 或知道其在DisplayPowerController()构造的时候初始化的。曲线设置好了,就应该扔代码里跑起来,模型建起来了,这个过程是咋样的呢?//它将负责曲线的创建,自动背光值的计算等。通过搜索配置关键词(

Android 1487

嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)

本文提供uC/OS-III实时操作系统的完整移植指南,涵盖源码配置、工程搭建到任务调度的全流程。针对移植中的常见编译错误,给出关键修改方案(如中断重定义、配置使能等),附已验证的工程源码,通过LED任务实验验证稳定性,帮助开发者高效完成移植。适合嵌入式工程师及RTOS学习者参考。

Bit_Dong的博客 2475

C#整个目录拷贝与删除的类

[原创]C#整个目录拷贝与删除的类/**//*  作者:网事如风*/using System;using System.Collections;using System.Windows.Forms;using System.IO;namespace DYBC...{                public class FileExec        ...{              

1598

基于FPGA的多通道音频信号采样系统设计

FPGA是随着数字集成电路的发展而逐步演变而来的。从早期的电子管、晶体管、小规模集成电路,到超大规模集成电路(VLSIC),数字集成电路的集成度和性能不断提升。FPGA的出现为系统设计师提供了灵活的设计平台,使其能够在不依赖半导体厂商的情况下快速设计专用集成电路(ASIC)。FPGA具有设计周期短、成本低、开发工具先进等优点,广泛应用于原型设计和产品生产中。VHDL是一种用于描述数字系统的硬件描述语言,其语言形式类似于计算机高级语言,但包含了许多硬件特征语句。

qq_62634009的博客 709

微软技术日报 11-09:.NET 8 与 9 明日同时停止支持,注册表编辑器出了 WinUI 3 版

今天这四条消息的共同点是收口。.NET 8 和 9 的支持期到点,注册表编辑器的新界面只放在仓库里给人看,GitHub 把一类危险触发器按住默认,微软在安全报告里把防线从地址黑名单挪到行为。收口并不等于关门。.NET 10 还在支持期里,被按住的触发器可以用策略按文件放回来,实验室里的样例随时可能变成产品。区别在于这些动作要有人签字,不再是默认开着。如果今天只做一件事,去看一眼构建机上的 .NET 版本。明天之后,8 和 9 的漏洞补丁不会再来了。

海盗Sharp的博客 392

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

AI驱动数据处理的安全边界:行业现状、风险权衡与本地化实践路径

本文基于第三方数据,分析AI用于数据处理的安全议题。大模型应用加速普及,但伴随数据出境、影子AI、幻觉与成本失控等风险。行业共识指向“脚本复用”路径:将分析逻辑本地化固化,实现数据可控、结果可复现、成本可降。产品如数以轻舟提供本地处理、多模型接入与一次付费永久使用方案。建议企业从数据落点、可控性、可复现性与合规性四维度评估选型,推动AI在安全边界内释放价值。

数据矿工-数据化运营博客 331

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

微软技术日报 11-08:Foundry 与 Entra 各挂一个 10.0 分漏洞,Foundry 接 fal 五款视频模型

这一周的动作可以分成两类。一类在收。Copilot 从电视上退场,搜索里的 AI 改成可选,云端漏洞只发通知不收补丁。共同点是承认铺得太开,代价比预期高。另一类在放。Foundry 一次摆上五个视频模型,容器版应用网关一个入口挂 64 个 MCP 服务器。共同点是把能力做成可组合的积木,让使用者按需挑。两个方向背后是同一个判断。把能力塞到每一个界面上,短期看覆盖率高,长期要解释为什么删不掉。新的做法是先给一个能关的开关,再谈覆盖。对每天写代码的人来说,今天有两样现成的东西可以试。

海盗Sharp的博客 439

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

微软技术周报 11-02~11-09:VS Code 混装 Claude 与 Codex、EF Core 11 静默改行为、.NET 11 倒计时

11 月 6 日,Power Platform 通过消息中心通知管理员,Copilot Studio、Power Automate 和 Power Apps 里所有跑在 Anthropic Claude、xAI Grok 以及旧版 GPT 上的 prompt,12 月 2 日自动迁移到 GPT-6 系列,档位价格不变,模型选择收窄到一条产品线。效果是这样的:让 Claude 评审一个 Copilot chat 写出的方案,或者把同样的任务交给 Codex,两边并排跑在同一个会话里。更要紧的是下周的时间线。

海盗Sharp的博客 1010

MAI-Cyber-1 深度解析:微软首个网络安全专用模型

微软没有去做"更大的安全大模型",而是用一颗 137B 总参、仅 5B 激活的稀疏 MoE 专用模型,配上 90/10 的"小模型铺量、大模型兜底"路由,在 CyberGym 基准上拿到 95.95% 的同时把成本砍掉一半——这标志着 AI 安全从"通用模型加提示词"进入了"专用模型加系统工程"的时代。

Simple_Pure的博客 335

微软技术日报 2026-11-14:Aion Instruct 接替 Phi Silica、1% 投毒与 SCKit 蠕虫

微软在 11 月 13 日公布了 Windows 本地语言模型的换代计划,Phi Silica 交棒给 Aion Instruct。同一周里,微软安全团队连发两项研究,证明训练环节掺进极少量数据就能让编码智能体执行攻击者的命令;微软威胁情报则拆解了一个借 ScreenConnect 反向打技术员的蠕虫工具包。Azure 这边,ARM 的 MCP 服务器从只读扩到了可写。下面按技术线逐条展开。

海盗Sharp的博客 302

微软输入法标点乱跳解决方案

微软拼音输入法常因“中文输入时使用英文标点”开关被意外开启,导致标点自动切换为英文且快捷键失效。本文提供一键批处理脚本,通过修改注册表(HKCU\Software\Microsoft\InputMethod\Settings\CHS)强制锁定中文标点,覆盖多个相关键值,确保设置持久生效。相比手动操作,该方案可抵御更新、同步等导致的配置重置,提升稳定性。执行后需重启输入法或系统以使更改生效,建议提前备份注册表。

谙弆悕博士的技术博客! 371

微软2026年11月补丁星期二解析:1094个 CVE、Outlook 零日 CVE-2026-124194 与修复优先级

微软11月补丁星期二修复1094个 CVE,唯一在野利用的 Outlook 零日 CVE-2026-124194 只评为“中等”,修复随 Office 更新下发、不在 Windows 累积更新里。本文整理漏洞分布、严重级漏洞分类处置与三档修复优先级。

SplashtopLoki的博客 235

【第 008 讲】在终端中运行 Python 程序:交互模式与脚本模式 | 绝对路径与相对路径 | 以模块方式运行 | 常见报错的识别与排查

本文系统讲解在终端中运行 Python 程序的方式:从交互模式与脚本模式讲起,梳理绝对路径与相对路径的运行写法及 cd、dir 等命令的用法;进而讲解以模块方式运行的特点与字节码缓存的产生;最后通过路径、拼写、标点三类典型报错,帮助读者掌握读懂报错、定位并修复错误的排查思路。

大模型全栈工程师 · Thanks_ks 799

情感交互机器人融资,四川具身科技的「爱湫」登场

当前人形机器人的主流战场是工业、仓储、巡检这些「干活」的场景,而「爱湫」把重心放在了「陪伴」上——通过面部投影和情绪识别,让机器人和人之间多一层情感层面的交互。情感交互机器人的市场,其实一直存在,只是过去被「能干活」的主流叙事盖住了。它主推的产品「爱湫」,是一款主打情感交互的人形机器人,搭载 3D 投影面部技术,情感交互机器人的逻辑,是面向养老陪伴、文旅服务、展厅导览这类「不要求重体力、但要求互动感」的场景。真正的考验不在发布会,而在它能不能在真实的养老和陪伴场景里,被用户用起来、留下来。

jushenAGI的博客 298

微软 365 全球掉线复盘,Purview 数据治理退役,C++ 动态调试转正

把今天这几条放在一起,会看到一个共同的题目,系统的自动判断出错时,人还能不能兜住。故障那条是自动判断误判。健康检查本来的职责是把坏机器摘出去,这次它把还能用的机器也摘了,剩下的机器承接双倍压力,再被摘掉,容量一路缩减。微软的补救方向很说明问题,一边验证一套替代的健康检查方式,一边准备自动检测并重启无响应服务器的机制,等于在原来的判断链路上加第二道保险。脚本那条是校验从宽容变严格。旧文件在宽松的校验下一直能用,规则一收紧,一批历史遗留的编码问题同时浮出水面,而表象是「签名没了」。

海盗Sharp的博客 306

ActiveX调用WScript.Shell原理揭秘

##核心原理概述通过 ActiveX 调用的本质,是利用 Windows 组件对象模型(COM)技术,在支持脚本或宏的环境中实例化一个系统级的外壳对象,从而获得执行操作系统命令、操作文件系统及注册表的权限。这种机制常被用于自动化运维,但也因具备“本地提权”和“无文件执行”的特性,成为恶意代码(如 Office 宏病毒、CHM电子书攻击)的核心利用手段。

m0_66048236的博客 172

微软Copilot生态深度解析:从办公助手到超级应用的整合趋势与实战技巧

在人工智能技术飞速发展的今天,微软Copilot已成为连接用户与AI生产力的核心桥梁。虽然“copilot-analysis”这一特定仓库可能指向具体的分析脚本或文档,但从更宏观的视角来看,它代表了当前对微软Copilot生态系统的深度探索。Copilot不仅仅是一个聊天机器人,它已经深度嵌入到Excel、Word、GitHub等核心生产力工具中,甚至正在向“超级应用”演进。

wulechun的博客 167
上一篇: C#整个目录拷贝与删除的类
下一篇: GridView/DataGrid导出成Excel文件的万能解决方法
SysBug
博客等级 码龄22年 3粉丝 14原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值