C# Runtime Compilation error: Type 'Double' and 'Math' could not be found/does not exist in current context

C# Runtime Compilation error: Type 'Double' and 'Math' could not be found/does not exist in current context

我已将 "System.dll" 添加到引用的编译器参数 assemblies.I 还注意到将 "Using System" 添加到 codeToCompile 或使用 "System.Math" 或 "System.Double" 有效fine.Not 确定出了什么问题。

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


    }

对于您在 .net 中使用的每个 class,您必须做两件事: 1)引用其程序集 2) 为其添加using语句,或键入完全限定名称,例如:System.Math

.net framework 的全局中没有 class,每个 class 都在某个程序集(命名空间)中

在您的代码顶部添加 "using System;" 如下所示:

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

System.Double 这样的基本类型在 mscorlib.dll.

如果在对象浏览器中添加选项 "View Containers" 就可以看到。

请注意,System.dllSystem.Core.dllmscorlib.dll 中已存在的命名空间添加了额外的类型。所以命名空间和 DLL 之间没有一对一的关系。

但可能默认添加了mscorlib.dll。如果您使用的是 C# 别名 stringdouble,您无需明确提及 System 命名空间就可以了,但否则您需要 using System; 或使用 using System; 限定类型它 (System.Double, System.Math.Pow).

使用"using...":

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

或不使用"using...":

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