2010-04-18 8 views
2

J'ai créé mon propre petit compilateur C# en utilisant le tutoriel sur MSDN, et cela ne fonctionne pas correctement. Je reçois quelques erreurs, puis je les répare, puis je reçois de nouvelles, différentes erreurs, puis je les répare, etcErreurs de fichier C# et de métadonnées

La dernière erreur est vraiment confus.

--------------------------- 

--------------------------- 
Line number: 0, Error number: CS0006, 'Metadata file 'System.Linq.dll' could not be found; 




--------------------------- 
OK 
--------------------------- 

Je ne sais pas ce que cela signifie.

Quelqu'un peut-il expliquer ce qui se passe ici?

Voici mon code.

MON ECHANTILLON C# COMPILER CODE: using System;

namespace JTM 
{ 
    public class CSCompiler 
    { 
     protected string ot, 
      rt, 
      ss, es; 

     protected bool rg, cg; 

     public string Compile(String se, String fe, String[] rdas, String[] fs, Boolean rn) 
     { 
      System.CodeDom.Compiler.CodeDomProvider CODEPROV = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp"); 
      ot = 
       fe; 

      System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters(); 
      // Ensure the compiler generates an EXE file, not a DLL. 
      PARAMS.GenerateExecutable = true; 
      PARAMS.OutputAssembly = ot; 

      foreach (String ay in rdas) 
      { 
       if (ay.Contains(".dll")) 
        PARAMS.ReferencedAssemblies.Add(ay); 
       else 
       { 
        string refd = ay; 
        refd = refd + ".dll"; 
        PARAMS.ReferencedAssemblies.Add(refd); 
       } 

      } 

      System.CodeDom.Compiler.CompilerResults rs = CODEPROV.CompileAssemblyFromFile(PARAMS, fs); 

      if (rs.Errors.Count > 0) 
      { 
       foreach (System.CodeDom.Compiler.CompilerError COMERR in rs.Errors) 
       { 
        es = es + 
         "Line number: " + COMERR.Line + 
         ", Error number: " + COMERR.ErrorNumber + 
         ", '" + COMERR.ErrorText + ";" + 
         Environment.NewLine + Environment.NewLine; 
       } 
      } 
      else 
      { 
       // Compilation succeeded. 
       es = "Compilation Succeeded."; 

       if (rn) System.Diagnostics.Process.Start(ot); 
      } 
      return es; 
     } 
    } 
} 

... Et voici l'application qui passe le code à la classe ci-dessus:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string[] f = { "Form1.cs", "Form1.Designer.cs", "Program.cs" }; 
      string[] ra = { "System.dll", "System.Windows.Forms.dll", "System.Data.dll", "System.Drawing.dll", "System.Deployment.dll", "System.Xml.dll", "System.Linq.dll" }; 
      JTS.CSCompiler CSC = new JTS.CSCompiler(); 
      MessageBox.Show(CSC.Compile(
       textBox1.Text, @"Test Application.exe", ra, f, false)); 
     } 
    } 
} 

Donc, comme vous pouvez le voir, toutes les directives à l'aide sont là. Je ne sais pas ce que cette erreur signifie. Toute aide est très appréciée.

Merci

+0

Je comprends ce que vous dites, mais avec moi, si ce n'est pas cryptique, ou si ça ne me fait pas penser, alors je ne m'en souviendrai jamais. Et, ils ne sont pas vraiment vides de sens: rdas signifie "assemblées référencées", et se signifie "Source". :) –

+2

@jts: quand vous visitez le code après quelques mois, vous vous maudirez pour le nom comme ça, au moins aller pour "refrdAsmbls", "src" etc –

+0

Rappelez-vous: si votre style de codage fonctionne pour vous et personne d'autre , il est plus difficile pour les autres de vous aider. – Joel

Répondre

9

Solution:

Ajouter ceci:

PARAMS.ReferencedAssemblies.Add(typeof(System.Xml.Linq.Extensions).Assembly.Location); 

Ainsi, le code ressemble maintenant à ceci:

namespace JTM 
{ 
    public class CSCompiler 
    { 
     protected string ot, 
      rt, 
      ss, es; 

     protected bool rg, cg; 

     public string Compile(String se, String fe, String[] rdas, String[] fs, Boolean rn) 
     { 
      System.CodeDom.Compiler.CodeDomProvider CODEPROV = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp"); 
      ot = 
       fe; 

      System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters(); 
      // Ensure the compiler generates an EXE file, not a DLL. 
      PARAMS.GenerateExecutable = true; 
      PARAMS.OutputAssembly = ot; 
      PARAMS.ReferencedAssemblies.Add(typeof(System.Xml.Linq.Extensions).Assembly.Location); 
      foreach (String ay in rdas) 
      { 
       if (ay.Contains(".dll")) 
        PARAMS.ReferencedAssemblies.Add(ay); 
       else 
       { 
        string refd = ay; 
        refd = refd + ".dll"; 
        PARAMS.ReferencedAssemblies.Add(refd); 
       } 

      } 

      System.CodeDom.Compiler.CompilerResults rs = CODEPROV.CompileAssemblyFromFile(PARAMS, fs); 

      if (rs.Errors.Count > 0) 
      { 
       foreach (System.CodeDom.Compiler.CompilerError COMERR in rs.Errors) 
       { 
        es = es + 
         "Line number: " + COMERR.Line + 
         ", Error number: " + COMERR.ErrorNumber + 
         ", '" + COMERR.ErrorText + ";" + 
         Environment.NewLine + Environment.NewLine; 
       } 
      } 
      else 
      { 
       // Compilation succeeded. 
       es = "Compilation Succeeded."; 

       if (rn) System.Diagnostics.Process.Start(ot); 
      } 
      return es; 
     } 
    } 
} 
+0

Nice. J'ai juste eu ce problème aussi - utilisais juste le nom de fichier .dll sans un chemin relatif ou absolu. Je pensais que le compilateur aurait regardé dans le répertoire "courant" pour l'assemblage? –