0

J'ai ajouté "System.dll" aux paramètres du compilateur référencés assemblies.J'ai également remarqué que l'ajout de "Utilisation de System "au codeToCompile OR en utilisant" System.Math "ou" System.Double "fonctionne très bien.Pas sûr de ce qui ne va pas.C# Runtime Erreur de compilation: Le type 'Double' et 'Math' est introuvable/n'existe pas dans le contexte actuel

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

essayer googler l'erreur exacte avez-vous au moins essayé d'abord ..? – MethodMan

+0

J'ai essayé cela. Trouvé un couple "Type 'Double' et 'Math' n'a pas pu être trouvé/n'existe pas dans le contexte actuel" erreurs mais aucune par rapport à Runtime Compilation – user3845413

+0

Que diriez-vous d'ajouter "using ...; using ...;" au codeToCompile? –

Répondre

2

aide "à l'aide ...":

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

ou ne pas utiliser "à l'aide ...":

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

Cela fonctionne bien comme je l'ai noté. Pourquoi est-ce: paramètres.ReferencedAssemblies.Add ("System.dll") ne fonctionne pas? – user3845413

+0

C'est comme si seulement ajouter un assembly System.dll mais oublier d'écrire "using System;" -> VS2015 va le montrer Red ... erreur de compilation ... Essayez de créer un nouveau projet, ajoutez System.dll dedans, et ne pas utiliser "using System;" -> ne peut pas être compilé. Dans System.dll il y a System.Double et System.Math mais pas Double et Math –

1

Pour chaque classe que vous utilisez dans .net vous devez faire 2 choses: 1) Référence de son assemblage 2) ajouter à l'aide pour la déclaration, ou tapez le nom complet, par exemple: System.Math

Il n'y a pas de classe dans l'économie mondiale dans le cadre .net, chaque classe est dans un certain assemblage (namespace)

Ajouter "using System;" au sommet de votre code comme ceci:

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

Comme je l'ai dit, faire cela fonctionne bien .. Je me demande juste pourquoi faire ceci: "parameters.ReferencedAssemblies.Add (" System.dll ")" ne fonctionne pas – user3845413

+0

Vous venez d'ajouter "System.dll" mais vous devez également appeler System.Double au lieu de Double. En raison de l'espace de noms. Si vous n'utilisez pas "using System;" et n'appelant que Double, où est Double? Il n'y a pas de Double, il n'y a que System.Double. –

+0

Vous avez raison. Mais je crois en utilisant des paramètres.ReferencedAssemblies.Add() est une alternative à le faire directement dans le code. – user3845413

1

Les types de base System.Double sont dans mscorlib.dll.

Vous pouvez voir que si vous ajoutez l'option "View Containers" dans le navigateur d'objets.

Notez que System.dll et System.Core.dll ajoutent des types supplémentaires aux espaces de noms déjà existants dans mscorlib.dll. Vous n'avez donc pas de relation 1-à-1 entre les espaces de noms et les DLL. Cependant, mscorlib.dll est probablement ajouté par défaut. Si vous travaillez avec les alias C# string, double, vous acceptez sans mentionner explicitement l'espace de noms System, mais sinon vous avez besoin d'un using System; ou qualifier les types avec (System.Double, System.Math.Pow).

+0

Essayé paramètres.ReferencedAssemblies.Add ("mscorlib.dll"); N'a pas fonctionné – user3845413