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