2011-07-06 8 views
2

私の目標:CodeDomを使用してWindowsフォームアプリケーション(実行可能ファイル)を作成します。これは私がフォームの中にいくつかのコードを書いておき、それを実行可能ファイルに変換することを意味します(Visual Studioに入り、 "Build"> "Build File"をクリックしたように)。確かに、私はこの例をオンラインで見つけたので、その後軽く修正しました。 このコードを生成しようとしているときにエラーが発生します。これまでに見たことがないエラーです。さらに、私はこれらのエラーをGoogleで見つけることができませんでした。(奇妙なのですか?)... 要素タイプSystem.CodeDom.CodeExpressionはサポートされていません。 パラメータ名:私は次の行に、このエラーを取得しています電子Codedomを使用してコードを生成しようとしているときにエラーが発生しました

:ここ

CodeProvider.GenerateCodeFromCompileUnit(Unit, writer, new CodeGeneratorOptions()); 

は私の完全なコードです:

{ 

    CodeDomProvider CodeProvider = CodeDomProvider.CreateProvider("CSharp"); 

     // Create the Unit 
    CodeCompileUnit Unit = new CodeCompileUnit(); 

    // Define a namespace and add Imports statements 
    CodeNamespace Namespaces = new CodeNamespace("Test.CreateForm"); 
     Namespaces.Imports.Add(new CodeNamespaceImport("System")); 
     Namespaces.Imports.Add(new CodeNamespaceImport("System.Drawing")); 
     Namespaces.Imports.Add(new CodeNamespaceImport("System.Windows.Forms")); 
     Namespaces.Imports.Add(new CodeNamespaceImport("System.Xml")); 
     Namespaces.Imports.Add(new CodeNamespaceImport("System.Data")); 

     Unit.Namespaces.Add(Namespaces); 

    // Declare the type including base type 
    CodeTypeDeclaration MyType = new CodeTypeDeclaration("Form1"); 
     MyType.IsClass = true; 
     MyType.TypeAttributes = System.Reflection.TypeAttributes.Public; 
     MyType.BaseTypes.Add("System.Windows.Forms.Form"); 

     Namespaces.Types.Add(MyType); 

    // Create the constructor and add code 
    CodeConstructor Constructor = new CodeConstructor(); 

    Constructor.Statements.Add(
     new CodeMethodInvokeExpression(
     new CodeThisReferenceExpression(),"InitializeComponent", new CodeExpression() {})); 

     Constructor.Attributes = MemberAttributes.Public ; 

    MyType.Members.Add(Constructor); 

    // Declare component container 
    MyType.Members.Add(new CodeMemberField("System.ComponentModel.IContainer", "components")); 



    // Implement the Dispose method 
    CodeMemberMethod DisposeMethod = new CodeMemberMethod(); 

    DisposeMethod.Name = "Dispose"; 
    DisposeMethod.Attributes = MemberAttributes.Family; 

    DisposeMethod.Parameters.Add(
     new CodeParameterDeclarationExpression(
     typeof(Boolean), "disposing")); 

    CodeConditionStatement Statement = new CodeConditionStatement(); 
    Statement.Condition = new CodeArgumentReferenceExpression("disposing"); 

    CodeConditionStatement TrueStatement = new CodeConditionStatement(); 
    TrueStatement.Condition = 
     new CodeBinaryOperatorExpression(
     new CodeArgumentReferenceExpression("components"), 
     CodeBinaryOperatorType.IdentityInequality, 
     new CodePrimitiveExpression(null)); 

    TrueStatement.TrueStatements.Add(
     new CodeMethodInvokeExpression(
     new CodeFieldReferenceExpression(null, 
      "components"), "Dispose", new CodeExpression() {})); 

    Statement.TrueStatements.Add(TrueStatement); 

    DisposeMethod.Statements.Add(Statement); 

    DisposeMethod.Statements.Add(new CodeMethodInvokeExpression(new CodeBaseReferenceExpression(), "Dispose", new CodeArgumentReferenceExpression[] 
     {new CodeArgumentReferenceExpression("disposing")})); 

    MyType.Members.Add(DisposeMethod); 


    // InitializeComponent 
    CodeMemberMethod InitializeMethod = new CodeMemberMethod(); 

    InitializeMethod.Name = "InitializeComponent"; 
    InitializeMethod.Attributes = MemberAttributes.Private; 

    InitializeMethod.CustomAttributes.Add(
    new CodeAttributeDeclaration(
     "System.Diagnostics.DebuggerStepThrough")); 

    InitializeMethod.Statements.Add(
    new CodeAssignStatement(
     new CodeFieldReferenceExpression(
     new CodeThisReferenceExpression(), "components"), 
      new CodeObjectCreateExpression(
      new CodeTypeReference(
       typeof(System.ComponentModel.Container)), 
       new CodeExpression() { }))); 

    MyType.Members.Add(InitializeMethod); 

    // Main entry point 
    CodeEntryPointMethod MainMethod = new CodeEntryPointMethod(); 
    MainMethod.Name = "Main"; 
    MyType.Members.Add(MainMethod); 

    //Add mouse move event 
    CodeMemberEvent eventstate = new CodeMemberEvent(); 
    eventstate.Name = "MouseMove"; 
    eventstate.Attributes = MemberAttributes.Final | MemberAttributes.Public; 
    eventstate.Type = new CodeTypeReference("System.Windows.Forms.MouseEventHandler"); 
    MyType.Members.Add(eventstate); 

    string OutputName = "Some.cs"; 

    try 
    { 

     CodeGeneratorOptions options = new CodeGeneratorOptions(); 
     options.BlankLinesBetweenMembers = true; 
     options.ElseOnClosing = false; 
     options.BracingStyle = "C"; 

     // This is what we'll write the generated code to 
     IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(OutputName, false), " "); 
     try 
     { 
      CodeProvider.GenerateCodeFromCompileUnit(Unit, writer, new CodeGeneratorOptions()); 
      writer.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      writer.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    // Create the compiler options 
    // Include referenced assemblies 
    CompilerParameters Options = new CompilerParameters(); 
    Options.GenerateExecutable = true; 
    Options.OutputAssembly = "TestForm1.exe"; 
    Options.CompilerOptions = "/target:winexe"; 
    Options.MainClass = "Test.CreateForm.Form1"; 

    string[] referenceAssemblies = { "System.dll", "System.Data.dll", "System.Drawing.dll", "System.Windows.Forms.dll", "System.XML.dll" }; 

    Options.ReferencedAssemblies.AddRange(referenceAssemblies); 

    //Build and look for compiler errors 
    CompilerResults Result = CodeProvider.CompileAssemblyFromFile(Options, "Some.cs"); 

    if (Result.Errors.Count > 0) 
    { 
     foreach(CompilerError ce in Result.Errors) 
     { 
      Console.WriteLine(ce.ErrorText); 
     } 

    } 
    else 
    { 
     Console.WriteLine("compiled successfully"); 
    } 

    Console.WriteLine("press enter to continue"); 
    Console.ReadLine(); 
    } 

答えて

1

あなたは空のCodeExpressionを作成する多くのインスタンスを持っていますたとえば、コンストラクタコードの場合:

 // Create the constructor and add code 
     CodeConstructor Constructor = new CodeConstructor(); 

     Constructor.Statements.Add(
      new CodeMethodInvokeExpression(
      new CodeThisReferenceExpression(), "InitializeComponent", new CodeExpression() { })); 

ifメソッドにパラメータを渡したくない場合(上のコードの場合)、単純に何も渡さない(CodeMethodInvokeExpressionコンストラクタはparams []配列を取るため、何も渡さなければ、 )それは空の配列を受け取ること:コード上記の場合

 // Create the constructor and add code 
     CodeConstructor Constructor = new CodeConstructor(); 

     Constructor.Statements.Add(
      new CodeMethodInvokeExpression(
      new CodeThisReferenceExpression(), 
      "InitializeComponent")); 
+0

これは私のコードがコンパイルされるという意味で機能しました。どうもありがとうございました!何らかの理由で、このプログラムから作成した実行可能ファイルを実行すると、何も表示されません。私は何かを追加することを忘れてしまったと確信していますが、私はそれを確かめるでしょう。もう一度 - ありがとう! –

1

は、必要なコードを吐きされていないあなたがIndentedTextWriterなどを閉じていることを確認してくださいwriter.Close()お楽しみください..

0

CodeExpressionの後に()を置き換えて[]と置き換えてください。エラーは消えます。

1
CodeMemberMethod DisposeMethod = new CodeMemberMethod(); 
DisposeMethod.Name = "Dispose"; 
DisposeMethod.ReturnType = new CodeTypeReference(typeof(void)); 
DisposeMethod.Attributes = MemberAttributes.Override | MemberAttributes.Private; 
DisposeMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(bool), "disposing")); 
myDesignerClass.Members.Add(DisposeMethod); 

CodeConditionStatement cstif2 = new CodeConditionStatement(); 
CodeExpression dis = new CodeVariableReferenceExpression("disposing"); 
CodeExpression comp = new CodeVariableReferenceExpression("components"); 

cstif2.Condition = new CodeBinaryOperatorExpression(dis, CodeBinaryOperatorType.BooleanAnd, new CodeBinaryOperatorExpression(dis, CodeBinaryOperatorType.IdentityInequality, new CodePrimitiveExpression(null))); 
CodeExpression dispos = new CodeMethodInvokeExpression(comp, "Dispose", new CodeExpression[] { }); 
cstif2.TrueStatements.Add(dispos); 
DisposeMethod.Statements.Add(cstif2); 
CodeExpression bdispos = new CodeMethodInvokeExpression(new CodeBaseReferenceExpression(), "Dispose", new CodeExpression[] { }); 
DisposeMethod.Statements.Add(bdispos); 
関連する問題