C# C运行时编译错误:在当前上下文中找不到或不存在类型“Double”和“Math”
我已将System.dll添加到编译器参数引用的程序集。我还注意到,将Using System添加到codeToCompile或Using System.Math或System.Double可以正常工作。不确定出了什么问题C# C运行时编译错误:在当前上下文中找不到或不存在类型“Double”和“Math”,c#,.net,visual-studio,compiler-errors,runtime-compilation,C#,.net,Visual Studio,Compiler Errors,Runtime Compilation,我已将System.dll添加到编译器参数引用的程序集。我还注意到,将Using System添加到codeToCompile或Using System.Math或System.Double可以正常工作。不确定出了什么问题 using Microsoft.CSharp; using System; using System.CodeDom.Compiler; using System.Text; using System.Windows.Forms;
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中使用的每个类,您必须做两件事: 1参考其组件 2为其添加using语句,或键入完全限定的名称,例如:System.Math 在.net framework的全局中没有类,每个类都在某个程序集命名空间中 增加使用系统;在代码的顶部,您可以这样做:
string codeToCompile =
@"
using System;
class TestPlugin
{
.....
对于在.net中使用的每个类,您必须做两件事: 1参考其组件 2为其添加using语句,或键入完全限定的名称,例如:System.Math 在.net framework的全局中没有类,每个类都在某个程序集命名空间中 增加使用系统;在代码的顶部,您可以这样做:
string codeToCompile =
@"
using System;
class TestPlugin
{
.....
基本类型如System.Double在mscorlib.dll中
如果在对象浏览器中添加“视图容器”选项,则可以看到
请注意,System.dll和System.Core.dll会向mscorlib.dll中已有的名称空间添加其他类型。因此,名称空间和DLL之间没有1对1的关系
但默认情况下可能会添加mscorlib.dll。如果您使用的是C别名字符串double,那么不需要显式地提到系统名称空间就可以了,但是您需要一个使用系统;或者使用it System.Double、System.Math.Pow来限定类型。基本类型如System.Double在mscorlib.dll中
如果在对象浏览器中添加“视图容器”选项,则可以看到
请注意,System.dll和System.Core.dll会向mscorlib.dll中已有的名称空间添加其他类型。因此,名称空间和DLL之间没有1对1的关系
但默认情况下可能会添加mscorlib.dll。如果您使用的是C别名字符串double,那么不需要显式地提到系统名称空间就可以了,但是您需要一个使用系统;或者使用it System.Double、System.Math.Pow.使用…:
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);
}
}
或者不使用…:
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);
}
}
使用…:
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);
}
}
或者不使用…:
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);
}
}
试着用谷歌搜索准确的错误你至少试过了吗…?试过了。发现一对类型“Double”和“Math”在当前上下文错误中找不到/不存在,但与运行时编译无关。使用…添加怎么样。。。;使用。。。;到codeToCompile?你在类标题中的使用部分是什么样子的?你能编辑你的代码并向我们展示吗。。?看看这篇使用.AddRange vs.Add函数的文章,试试谷歌搜索确切的错误你至少试过了吗?试过了。发现一对类型“Double”和“Math”在当前上下文错误中找不到/不存在,但与运行时编译无关。使用…添加怎么样。。。;使用。。。;到codeToCompile?你在类标题中的使用部分是什么样子的?你能编辑你的代码并向我们展示吗。。?看看这篇文章,它使用了.AddRange和.Add函数,就像我说的,这样做很好。。我只是想知道为什么这样做:parameters.referencedsassemblies.AddSystem.dll不起作用您只需添加System.dll,但必须同时调用System.Double而不是Double。因为名称空间。如果您没有使用系统;只叫替身,替身在哪里?没有替身,只有系统。替身。你说得对。但我相信使用parameters.ReferencedAssemblys.Add是直接在代码中执行的替代方法。@user3845413不,不是,请自己尝试,自己尝试,创建新项目,使用VS向导添加对某个程序集的引用,然后尝试调用该程序集的类而不使用,即使您已经添加了引用,您也会看到它在抱怨。正如我所说,这样做很好。。我只是想知道为什么这样做:parameters.referencedsassemblies.AddSystem.dll不起作用您只需添加System.dll,但必须同时调用System.Double而不是Double。因为名称空间。如果您没有使用系统;只叫替身,替身在哪里?没有替身,只有系统。替身。你说得对。但我相信使用parameters.ReferencedAssemblys.Add是直接在代码中执行的替代方法。@user3845413不,不是,请自己尝试,自己尝试,创建新项目,使用VS向导添加对某个程序集的引用,然后尝试调用该程序集的类而不使用,即使您已经添加了引用,您也会看到它抱怨。已尝试使用它参数。ReferencedAssemblys.Addmscorlib.dll;未工作尝试了它的参数。ReferencedAssemblys.Addmscorlib.dll;不起作用,正如我所说的那样,效果很好。为什么:parameters.ReferencedAssemblys.AddSystem.dll不起作用?这就像只添加一个assembly System.dll,而忘记使用System编写;->VS2015
将显示红色。。。编译器错误。。。尝试创建新项目,在其中添加System.dll,并且不要使用System;->无法编译。在System.dll中有System.Double和System.Math,但不是Double和Math,正如我所指出的那样,它们工作正常。为什么:parameters.ReferencedAssemblys.AddSystem.dll不起作用?这就像只添加一个assembly System.dll,而忘记使用System编写;->VS2015将显示为红色。。。编译器错误。。。尝试创建新项目,在其中添加System.dll,并且不要使用System;->无法编译。在System.dll中有System.Double和System.Math,但没有Double和Math