1

我已将“System.dll”添加到编译器参数引用的程序集中。我还注意到将“使用系统”添加到 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");


    }
4

3 回答 3

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);
    }
}
于 2016-07-04T00:09:48.293 回答
1

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

.net 框架中的全局没有类,每个类都在某个程序集(命名空间)内

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

string codeToCompile =
     @"
using System;
class TestPlugin
{
.....
于 2016-07-04T00:02:19.830 回答
1

像这样的基本类型System.Doublemscorlib.dll.

如果您在对象浏览器中添加选项“查看容器”,您可以看到这一点。

请注意,System.dll并将System.Core.dll其他类型添加到mscorlib.dll. 因此,命名空间和 DLL 之间没有一对一的关系。

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

于 2016-07-04T00:05:35.503 回答