标题说我正在尝试做什么。如果我没有指定LinqOverTypedDatasets
选项,我可以成功生成程序集,但我希望我的类型化DataSet支持LINQ查询。
我的代码输出错误:
error CS0006: Metadata file 'System.Data.DataSetExtensions.dll' could not be found
代码:
//System.Data.DataSet myDataSet = << assume myDataSet is valid DataSet object >>;
Dictionary<string, string> options = new Dictionary<string, string>();
options.Add("CompilerVersion", "v3.5");
using (CSharpCodeProvider cscp = new CSharpCodeProvider(options))
{
CodeNamespace ns = new CodeNamespace("DBSPPS");
CodeCompileUnit ccu = new CodeCompileUnit();
using (StringWriter schemaWriter = new StringWriter())
{
myDataSet.WriteXmlSchema(schemaWriter);
TypedDataSetGenerator.Generate(schemaWriter.ToString(),
ccu,
ns,
cscp,
TypedDataSetGenerator.GenerateOption.LinqOverTypedDatasets
);
}
StringWriter codeWriter = new StringWriter();
cscp.GenerateCodeFromNamespace(ns, codeWriter, new CodeGeneratorOptions());
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = "DBSPPS.dll";
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Data.dll");
parameters.ReferencedAssemblies.Add("System.Xml.dll");
parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
CompilerResults cr = cscp.CompileAssemblyFromSource(parameters,new string[]{ codeWriter.ToString() });
foreach (string msg in cr.Output)
Console.WriteLine(msg);
}
编辑:想出来了,更正后的代码出现在上面! :)当描述将编译器版本设置为3.5时,MSDN文档为WRONG。正如文档所说,CompilerVersion的值应该是“v3.5”而不是“3.5”。
当我没有引用所需的assembiles(System.dll等)时,我得到了相同的编译错误,这是通过将它们添加到ReferencedAssemblies
对象的CompilerParameters
集合来修复的。但是,当我收到有关System.Data.DataSetExtensions.dll
的错误消息时,将该程序集添加到ReferencedAssemblies
仍然会导致相同的错误。
我注意到System.Data.DataSetExtensions.dll
不在我预期的位置(\WINDOWS\Microsoft.NET\Framework\v3.5
),而在\Program Files\Reference Assemblies\Microsoft\Framework\v3.5
。我尝试指定完整路径,但也没有用。我假设由于未为其他引用的程序集指定完整路径,因此它在GAC中找到它们。这不是System.Data.DataSetExtensions.dll
的情况吗?或者还有其他事情发生了吗?
感谢您的帮助。