繁体   English   中英

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

[英]Roslyn compilation: type is defined in an assembly that is not referenced

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

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

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

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

谢谢!

好的,找到了解决方案。 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));

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

assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default

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

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

这里有一些相关的错误,一个在MSBuild目标中,另一个在Roslyn的MSBuildWorkspace中。 当用于VS2015软件包的MSBuild工具的RTM版本和Roslyn的1.0版本出来时,它们都应该被修复。

通常,MSBuild将自动添加对System.Runtime的引用,并且您的其余外观程序集通过“ImplicitlyExpandDesignTimeFacades”目标引用可移植类库,但这对于MSBuildWorkspace而言已被破坏。 (注意:截至2015年7月20日,现在已修复此问题。)

有关更多详细信息,请参阅https://github.com/dotnet/roslyn/issues/2824

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM