尝试生成语义模型时无法加载文件或程序集System.Reflection.Metadata

时间:2018-03-19 07:23:54

标签: c# .net roslyn

我正在尝试使用以下代码生成代码文件的语义模型:

IEnumerable<string> DefaultNamespaces =
new[]
{
    "System","System.IO","System.Net","System.Linq","System.Text","System.Text.RegularExpressions","System.Collections.Generic"
};

//string runtimePath = @"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\{0}.dll";
//var z = MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.5\Profile\Profile7\System.Runtime.dll");

IEnumerable<MetadataReference> DefaultReferences =
    new[]
    {
       MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
    };

CSharpCompilationOptions DefaultCompilationOptions =
   new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary).WithOverflowChecks(true).WithOptimizationLevel(OptimizationLevel.Release).WithUsings(DefaultNamespaces);

var compilation = CSharpCompilation.Create("Test.dll", new SyntaxTree[] { syntaxTree }, DefaultReferences, DefaultCompilationOptions);
var result = compilation.GetSemanticModel(syntaxTree, true);

但是行:

IEnumerable<MetadataReference> DefaultReferences =
                        new[]
                        {
                           MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
                        };

抛出异常:

  

无法加载文件或程序集&System; System.Reflection.Metadata。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您需要在项目中的该引用的属性中将Copy Local设置为true(如果没有引用,则从NuGet添加它)。

Roslyn在运行时需要这个DLL。