2010-04-18 2 views
2

Я создал свой собственный небольшой компилятор C#, используя учебник по MSDN, и он не работает должным образом. Я получаю несколько ошибок, затем исправляю их, затем получаю новые, разные ошибки, затем исправляю их и т. Д.Ошибки файла C# и метаданных

Последняя ошибка меня действительно сбивает с толку.

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

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




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

Я не знаю, что это значит.

Может кто-нибудь объяснить, что здесь происходит?

Вот мой код.

МОЙ ОБРАЗЕЦ 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; 
     } 
    } 
} 

... А вот приложение, которое передает код на класс выше:

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)); 
     } 
    } 
} 

Итак, как вы можете видеть, все с помощью директивы есть. Я не знаю, что означает эта ошибка. Любая помощь вообще очень ценится.

Спасибо

+0

Я понимаю, что вы говорите, но с я, если это не загадочно, или если это не заставляет меня думать, тогда я никогда не забуду это. И они не имеют никакого смысла: rdas означает «Связанные сборки», а se означает «Источник». :) – 2010-04-18 04:25:35

+2

@jts: когда вы посетите код через несколько месяцев, вы будете проклинать себя за то, что назвали это, по крайней мере, для «refrdAsmbls», «src» и т. Д. –

+0

Помните: если ваш стиль кодирования работает для вас и никого другого , это затрудняет помощь другим людям. – Joel

ответ

9

Решение:

Добавить это:

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

Так что код теперь выглядит следующим образом:

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

Ницца. У меня тоже была эта проблема, - я использовал только имя .dll без относительного или абсолютного пути. Я думал, что компилятор заглянул бы в «текущий» каталог сборки? –

Смежные вопросы