Определение ссылочной сборки не достаточно, чтобы сообщить компилятору, откуда взято имя класса. Вы должны указать либо полное имя типа (System.Collections.Generic.Dictionary<string, string>
), либо определить с помощью оператора using.
Чтобы помочь вам понять ошибки, вы можете взглянуть на диагностический отчет. (Из CSharpCompilation или SyntaxTree).
foreach (var d in compilation.GetDiagnostics())
{
Console.WriteLine(CSharpDiagnosticFormatter.Instance.Format(d));
}
Это даст вам следующее:
(11,1): error CS1022: Type or namespace definition, or end-of-file expected
(4,10): error CS0246: The type or namespace name 'Dictionary<,>' could not be found (are you missing a using directive or an assembly reference?)
error CS5001: Program does not contain a static 'Main' method suitable for an entry point
(5,30): warning CS0219: The variable 'x' is assigned but its value is never used
(4,37): warning CS0169: The field 'MyClass.dict' is never used
(3,14): warning CS0169: The field 'MyClass.z' is never used
Следующая ошибка - ошибка пространства имен.
(4, 10): ошибка CS0246: не удалось найти тип или имя пространства имен Dictionary <,>> (отсутствует директива using или ссылка на сборку?)
Но вы можете видеть, что некоторыедругие там. Следующее здесь из-за дополнительных }
в конце скрипта.
(11,1): ошибка CS1022: определение типа или пространства имен или ожидаемый конец файла
Конец последнего:
ошибка CS5001: Программа не содержит статический метод 'Main', подходящий для точки входа
Это потому, чтопо умолчанию компилятор пытается построить исполняемый файл вместо библиотеки. Вы можете изменить это с помощью OutputKind
enum.
var compilation = CSharpCompilation.Create(
"MyCompilation",
syntaxTrees: new[] { tree },
references: new[] { Mscorlib },
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
Edit:
Если вы хотите найти OutputKind из существующего файла csproj, вы можете сделать это следующим образом: (вдохновлено это суть
// Nuget :
// https://www.nuget.org/packages/Microsoft.Build.Locator
// https://www.nuget.org/packages/Microsoft.CodeAnalysis.Workspaces.MSBuild/
// https://www.nuget.org/packages/Microsoft.CodeAnalysis
if (!MSBuildLocator.IsRegistered)
{
MSBuildLocator.RegisterDefaults();
}
using(var wp = MSBuildWorkspace.Create()){
var project = await wp.OpenProjectAsync(@"pathtocsprojfile.csproj");
Console.WriteLine(project.CompilationOptions.OutputKind);
}