Roslyn编译:类型在未引用的程序集中定义

Ben*_*dEg 2 .net c# compilation mscorlib roslyn

我尝试使用Roslyn编译一些代码,但收到以下错误消息:

CS0012:类型'Func <,>'在未引用的程序集中定义.您必须添加对程序集'System.Runtime,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'的引用.

我仍然Func<, >对这条消息感到疑惑,因为应该在mscorelib而不是在System.Runtime.我已经搜索过这个bug,只找到了一个应该有用的热修复,但是没有.

有没有人与.net 4.5.1和最新的Roslyn版本有类似的问题?

谢谢!

Ben*_*dEg 5

好的,找到了解决方案.System.Runtime似乎是问题(一开始我认为不是一个有问题的libs的问题).

我需要使用以下代码片段:

 List<PortableExecutableReference> refs = new List<PortableExecutableReference>();
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "mscorlib.dll")));
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.dll")));
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Core.dll")));
 refs.Add(MetadataReference.CreateFromFile(Path.Combine(assemblyPath, "System.Runtime.dll")));
 refs.Add(MetadataReference.CreateFromFile(Assembly.GetEntryAssembly().Location));
Run Code Online (Sandbox Code Playgroud)


Ser*_*diy 5

我最近遇到了类似的问题。我添加了以下行并解决了问题:

assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default
Run Code Online (Sandbox Code Playgroud)

整个CSharpCompilation对象初始化如下所示:

var compilation = CSharpCompilation.Create(
    assemblyName,
    new[] { syntaxTree },
    references,
    new CSharpCompilationOptions(
        OutputKind.DynamicallyLinkedLibrary,
        optimizationLevel: OptimizationLevel.Release,
        assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default));
Run Code Online (Sandbox Code Playgroud)