gpt4 book ai didi

linq - LINQ扩展在CSharpCodeProvider内部不可用

转载 作者:行者123 更新时间:2023-12-02 10:44:19 24 4
gpt4 key购买 nike

我有一个.NET应用程序,可以使用C#编写脚本并在内部执行它。脚本由下面列出的类进行解析,然后进行编译。我发现,每当尝试在已编译的C#脚本中使用System.Xml.Linq时,都会出现编译错误,并且不确定为什么。

public static void CreateFunction(string scriptCode, BO.ObjectBO obj)
{
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters options = new CompilerParameters();
options.ReferencedAssemblies.Add("System.Data.dll");
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.Xml.dll");
options.ReferencedAssemblies.Add("System.Linq.dll");
options.ReferencedAssemblies.Add("System.Xml.Linq.dll");

options.GenerateExecutable = false;
options.GenerateInMemory = true;
CompilerResults results = provider.CompileAssemblyFromSource(options, scriptCode);

_errors = results.Errors;

if (results.Errors.HasErrors)
{
DataTable errorTable = BO.DataTableBO.ErrorTable();
foreach(CompilerError err in results.Errors)
{
DataRow dr = errorTable.NewRow();
dr["ErrorMessage"] = "Line "+ err.ErrorNumber.ToString() + " " + err.ErrorText;
errorTable.Rows.Add(dr);
}
return;
}

Type binaryFunction = results.CompiledAssembly.GetType("UserFunctions.BinaryFunction");

_methodInfo = binaryFunction.GetMethod("Function");
}

这是我尝试运行在编译器中使用 LINQ extensions的脚本时收到的错误消息。
'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>' does not contain a definition for 'Select' and no extension method 'Select' accepting a first argument of type 'System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>' could be found (are you missing a using directive or an assembly reference?)

有人看到我可能做错了吗?我试图包含 System.LinqSystem.Xml.Linq,但编译器似乎无法找到它们。

这是我尝试编译的使用LINQ扩展的示例C#脚本。
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Xml.Linq;

namespace CompilerTest
{
public class BinaryFunction
{
public static void Function()
{
string xmlData = @"<data>
<clients>
<client>
<clientId>1</clientId>
<clientName>Dell</clientName>
</client>
<client>
<clientId>2</clientId>
<clientName>Apple</clientName>
</client>
</clients>
</data>";

XDocument xDoc = XDocument.Parse(xmlData);

List<string> results = xDoc.Descendants("data")
.Descendants("client")
.Select(x => x.Element("clientName").Value)
.ToList<string>();

}
}
}

更新:我确认GAC中包含以下程序集。 System.XmlSystem.Xml.Linq。我还将编译器版本添加到了构造函数中,但仍然出现相同的错误。
  CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v4.6.1" } })

最佳答案

搜索相关错误后,我找到了解决方案。我需要添加System.Core作为引用程序集。

options.ReferencedAssemblies.Add("System.Core.dll");

完成此操作后,便使用了LINQ程序集,并且能够使用LINQ扩展。所以要明确我的新代码是
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters options = new CompilerParameters();
options.ReferencedAssemblies.Add("System.Data.dll");
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.Xml.dll");
options.ReferencedAssemblies.Add("System.Linq.dll");
options.ReferencedAssemblies.Add("System.Xml.Linq.dll");
options.ReferencedAssemblies.Add("System.Core.dll");

我不确定为什么需要添加对 System.Core.dll的引用,因为我认为在创建编译器实例时默认引用了它,但我想不是。

关于linq - LINQ扩展在CSharpCodeProvider内部不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48833630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com