2016-07-03 10 views
0

Ich habe "System.dll" zum Compiler-Parameter referenzierte Assemblys hinzugefügt. Ich bemerkte auch, dass das Hinzufügen zu "Using System "an die codeToCompile ODER mit" System.Math "oder" System.Double "funktioniert gut.Nicht sicher, was los ist.C# Runtime Compilierungsfehler: Typ 'Double' und 'Math' konnte nicht gefunden werden/existiert nicht im aktuellen Kontext

using Microsoft.CSharp; 
    using System; 
    using System.CodeDom.Compiler; 
    using System.Text; 
    using System.Windows.Forms; 

    private void onLoadPlugin(object sender, EventArgs e) 
    { 
     string codeToCompile = 
    @" 

class TestPlugin 
{ 
    public string ArithmeticOperator 
    { 
     get { return ""X^2""; } 
    } 
    public double PerformCalculation(string value) 
    { 
     Double var = Double.Parse(value); 
     if (var == 0) 
      return 0; 
     return Math.Pow(var, 2); 
    } 
} 
     "; 

     CSharpCodeProvider provider = new CSharpCodeProvider();//new Dictionary<String, String> { { "CompilerVersion", "v4.0" } }); 
     CompilerParameters parameters = new CompilerParameters(); 
     parameters.ReferencedAssemblies.Add("System.dll");//This doesn't seem to be working 

      parameters.GenerateInMemory = false; 
      parameters.GenerateExecutable = false; 
      parameters.OutputAssembly = "TestPlugin.dll"; 

     CompilerResults results = provider.CompileAssemblyFromSource(parameters, codeToCompile); 
     if (results.Errors.Count != 0) 
      throw new Exception("Mission Failed"); 


    } 
+0

versuchen, den genauen Fehlern googeln Sie haben zumindest versucht, die ersten ..? – MethodMan

+0

Versuchte das. Paar gefunden "Typ 'Double' und 'Math' konnten nicht gefunden werden/existiert im aktuellen Kontext nicht" Fehler aber keine in Bezug auf Runtime Compilation – user3845413

+0

Wie wäre es mit "using ...; using ...;" zur codeToCompile? –

Antwort

2

verwenden "mit ...":

using System; 
class TestPlugin 
{ 
    public string ArithmeticOperator 
    { 
     get { return ""X^2""; } 
    } 
    public double PerformCalculation(string value) 
    { 
     Double var = Double.Parse(value); 
     if (var == 0) 
      return 0; 
     return Math.Pow(var, 2); 
    } 
} 

oder nicht mit "mit ...":

class TestPlugin 
{ 
    public string ArithmeticOperator 
    { 
     get { return ""X^2""; } 
    } 
    public double PerformCalculation(string value) 
    { 
     System.Double var = System.Double.Parse(value); 
     if (var == 0) 
      return 0; 
     return System.Math.Pow(var, 2); 
    } 
} 
+0

Das funktioniert gut, wie ich festgestellt habe. Warum ist das: Parameter.ReferenzierteAssemblies.Add ("System.dll") funktioniert nicht? – user3845413

+0

Es ist wie nur eine Assembly System.dll hinzufügen, aber vergessen Sie zu schreiben "using System;" -> VS2015 zeigt es Red ... Compiler-Fehler ... Versuchen Sie, ein neues Projekt zu erstellen, fügen Sie System.dll darin hinzu, und verwenden Sie nicht "using System;" -> kann nicht zusammengestellt werden. In System.dll gibt es System.Double und System.Math aber nicht Double und Math –

1

Für jede Klasse, die Sie in .net verwenden Sie 2 Dinge tun müssen: 1) Hinweis seiner Montage 2) fügen Sie es mit Anweisung oder den vollständig qualifizierten Namen zB Typ: System.Math

Es gibt keine Klasse in der globalen in .NET Framework, ist jede Klasse innerhalb einer Baugruppe (Namespace)

hinzufügen "using System;" an der Spitze der Code wie folgt zu sein:

string codeToCompile = 
    @" 
using System; 
class TestPlugin 
{ 
..... 
+0

Wie ich schon sagte, dabei funktioniert gut .. Ich frage mich nur, warum dies tun: "parameters.ReferencedAssemblies.Add (" System.dll ")" funktioniert nicht – user3845413

+0

Sie fügen nur "System.dll", aber Sie müssen auch System.Double anstelle von Doppelt. Wegen des Namensraums. Wenn Sie nicht "System verwenden" verwenden und nur Double aufrufen, wo ist Double? Es gibt kein Double, es gibt nur System.Double. –

+0

Sie haben Recht. Aber ich glaube, Parameter zu verwenden. ReferencedAssemblies.Add() ist eine Alternative, es direkt in Code zu tun. – user3845413

1

Die Basistypen wie System.Double sind in mscorlib.dll.

Das können Sie sehen, wenn Sie die Option "Container anzeigen" im Objektbrowser hinzufügen.

Beachten Sie, dass System.dll und zusätzliche Typen zu Namespaces hinzufügen, die bereits in mscorlib.dll vorhanden sind. Sie haben also keine 1: 1-Beziehung zwischen Namespaces und DLLs.

Aber wahrscheinlich mscorlib.dll wird standardmäßig hinzugefügt. Wenn Sie mit den C# -Alias ​​string, double arbeiten, sind Sie in Ordnung, ohne den Namespace System explizit zu erwähnen, aber ansonsten benötigen Sie entweder using System; oder qualifizieren Sie die Typen damit (System.Double, System.Math.Pow).

+0

Versuchte es Parameter. ReferencedAssemblies.Add ("mscorlib.dll"); Hat nicht funktioniert – user3845413