C#运行时编译错误:在当前上下文中找不到/不存在类型'Double'和'Math'

时间:2016-07-03 23:54:56

标签: c# .net visual-studio compiler-errors runtime-compilation

我已将“System.dll”添加到编译器参数引用的程序集中。我还注意到将“Using System”添加到codeToCompile或使用“System.Math”或“System.Double”工作正常。不确定是什么错。

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


    }

3 个答案:

答案 0 :(得分:3)

使用“使用......”:

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

或不使用“使用......”:

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

答案 1 :(得分:1)

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

.net框架中的全局没有类,每个类都在某个程序集(Namespace)

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

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

答案 2 :(得分:1)

System.Double等基本类型位于mscorlib.dll

如果添加选项&#34; View Containers&#34;在对象浏览器中。

请注意,System.dllSystem.Core.dll会向mscorlib.dll中已存在的命名空间添加其他类型。因此,命名空间和DLL之间没有一对一的关系。

但默认情况下可能会添加mscorlib.dll。如果您正在使用C#别名stringdouble,则可以在没有明确提及System命名空间的情况下使用,但是您需要using System;或者使用System.Double来限定类型它(System.Math.Powmain)。