Программное создание типизированного набора данных для LINQ — отсутствует файл метаданных?

Название говорит о том, что я пытаюсь сделать. Я могу успешно сгенерировать сборку, если не укажу параметр LinqOverTypedDatasets, но я хочу, чтобы мой типизированный набор данных поддерживал запросы с 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);
}

РЕДАКТИРОВАТЬ: разобрался, выше указан исправленный код! :) Документация MSDN ОШИБОЧНА, когда описывает установку версии компилятора на 3.5. Значение для CompilerVersion должно быть "v3.5", а НЕ "3.5", как указано в документации.

Я получил те же ошибки компиляции, когда я не ссылался на необходимые сборки (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? Или что-то еще происходит?

Спасибо за вашу помощь.


person Matt Crouch    schedule 21.11.2008    source источник


Ответы (1)


Попробуйте изменить конфигурацию, чтобы она знала о 3.5 — см. пример конфигурации здесь.

person Marc Gravell    schedule 21.11.2008