以编程方式为LINQ生成类型化DataSet - “元数据文件”丢失了吗?

时间:2008-11-21 18:14:16

标签: c# .net linq

标题说我正在尝试做什么。如果我没有指定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的情况吗?或者还有其他事情发生了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

尝试调整配置,使其知道3.5 - 请参阅配置示例here