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.dll
和 System.Core.dll
向 mscorlib.dll
中已存在的命名空间添加了额外的类型。所以命名空间和 DLL 之间没有一对一的关系。
但可能默认添加了mscorlib.dll
。如果您使用的是 C# 别名 string
、double
,您无需明确提及 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);
}
}
我已将 "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.dll
和 System.Core.dll
向 mscorlib.dll
中已存在的命名空间添加了额外的类型。所以命名空间和 DLL 之间没有一对一的关系。
但可能默认添加了mscorlib.dll
。如果您使用的是 C# 别名 string
、double
,您无需明确提及 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);
}
}