C# Roslyn没有对System.Runtime的引用
我正在做一个项目,我们正在使用Roslyn为我们编译一些模板。 现在,当我编译模板时,我在C# Roslyn没有对System.Runtime的引用,c#,roslyn,C#,Roslyn,我正在做一个项目,我们正在使用Roslyn为我们编译一些模板。 现在,当我编译模板时,我在CompileResult.Diagnostics中收到多个错误 错误是: (21,6): error CS0012: The type 'System.Attribute' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0
CompileResult.Diagnostics
中收到多个错误
错误是:
(21,6): error CS0012: The type 'System.Attribute' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
(21,6): error CS0012: The type 'System.Type' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
看到这些错误,我假设我没有正确添加对System.Runtime
程序集的引用。但是,在检查加载的程序集后,这似乎是正常的
private IEnumerable<MetadataReference> GetGlobalReferences()
{
var assemblies = new []
{
typeof(System.Object).Assembly, //mscorlib
typeof(System.Composition.ExportAttribute).Assembly, //System.Composition (MEF)
typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler
};
var refs = from a in assemblies
select new MetadataFileReference(a.Location);
return refs.ToList();
}
我错过了什么明显的东西吗?看起来成功编译的所有先决条件都满足了,但显然没有
作为参考,这是我试图编译的(模糊的)代码:
namespace Project.Rules.Generated
{
using System;
using System.Runtime;
using System.Composition;
using System.CodeDom.Compiler;
[Export(typeof(IProject))]
[GeneratedCode("Project Template Compiler", "1.0")]
public sealed class ProcessPriorityValue : ProjectConcreteClass
{
public override void Execute(ProjectExecutionContext ctx)
{
CurrentContext = ctx;
}
}
}
编辑
我在搜索方面有点进步。错误消息中指定的PublicKeyToken与System.Composition程序集的PublicKeyToken匹配。我猜添加所有的程序集可能会解决这个问题。
这是正确的,或者至少是解决方案的一部分。
通过使用dotPeek,我能够检查不同程序集中存在哪些对象。
有了这些知识,我将GetGlobalReferences()
方法更改为:
private IEnumerable<MetadataReference> GetGlobalReferences()
{
var assemblies = new []
{
typeof(System.Object).Assembly, //mscorlib
typeof(System.Composition.ExportAttribute).Assembly, //System.Composition.AttributeModel
typeof(System.Composition.Convention.ConventionBuilder).Assembly, //System.Composition.Convention
typeof(System.Composition.Hosting.CompositionHost).Assembly, //System.Composition.Hosting
typeof(System.Composition.CompositionContext).Assembly, //System.Composition.Runtime
typeof(System.Composition.CompositionContextExtensions).Assembly, //System.Composition.TypedParts
typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler
};
var refs = from a in assemblies
select new MetadataFileReference(a.Location);
return refs.ToList();
}
出于某种原因,代码现在希望使用System.Composition.Runtime.Export
,而不是System.Composition.AttributeModel
程序集中定义的ExportAttribute
edit2
我可以确认上面的代码使用的是System.Composition.Export
,而不是ExportAttribute
。我通过将[Export(typeof(IProject)]
更改为[ExportAttribute(typeof(IProject)]
发现了这一点。由于此更改,返回了原始错误。
看起来程序集System.Composition.AttributeModel
没有正确加载/引用,但是在检查编译后,我可以看到程序集被引用了,ok
我目前得到的引用程序集包括:
+ [0] mscorlib, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
+ [1] System.Composition.AttributedModel, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [2] System.Composition.Convention, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [3] System.Composition.Hosting, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [4] System.Composition.Runtime, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [5] System.Composition.TypedParts, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [6] Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [7] System, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
+ [8] System.Core, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
+ [9] System.Data, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
似乎您正在引用一个可移植类库。可移植类库从“System.Runtime.dll”中提取一些基本类型(如object/string/etc)。但是,在桌面框架中,这些类型来自mscorlib.dll。当您使用typeof(object)时.Assembly
,您将获得Roslyn自己版本的对象
。由于Roslyn不是作为可移植类库构建的,这是一个来自mscorlib的类库,并且与您的其他引用的标识不匹配。根据Dejan在评论部分的请求,我将把我的问题的答案作为真实答案发布
我发现了问题所在!编译器一直都是正确的。of触发了我尝试其他东西。与其使用Facade dll,不如尝试手动引用必要的dll。
GetGlobalReferences
方法现在如下所示:
private IEnumerable<MetadataReference> GetGlobalReferences()
{
var assemblies = new []
{
/*Making sure all MEF assemblies are loaded*/
typeof(System.Composition.Convention.AttributedModelProvider).Assembly, //System.Composition.AttributeModel
typeof(System.Composition.Convention.ConventionBuilder).Assembly, //System.Composition.Convention
typeof(System.Composition.Hosting.CompositionHost).Assembly, //System.Composition.Hosting
typeof(System.Composition.CompositionContext).Assembly, //System.Composition.Runtime
typeof(System.Composition.CompositionContextExtensions).Assembly, //System.Composition.TypedParts
/*Used for the GeneratedCode attribute*/
typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler
};
var refs = from a in assemblies
select new MetadataFileReference(a.Location);
var returnList = refs.ToList();
//The location of the .NET assemblies
var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
/*
* Adding some necessary .NET assemblies
* These assemblies couldn't be loaded correctly via the same construction as above,
* in specific the System.Runtime.
*/
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "mscorlib.dll")));
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.dll")));
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.Core.dll")));
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.Runtime.dll")));
return returnList;
}
private IEnumerable GetGlobalReferences()
{
var assemblies=new[]
{
/*确保已加载所有MEF程序集*/
typeof(System.Composition.Convention.AttributedModelProvider).Assembly,//System.Composition.AttributeModel
typeof(System.Composition.Convention.ConventionBuilder).Assembly,//System.Composition.Convention
typeof(System.Composition.Hosting.CompositionHost).Assembly,//System.Composition.Hosting
typeof(System.Composition.CompositionContext).Assembly,//System.Composition.Runtime
typeof(System.Composition.CompositionContextensions).Assembly,//System.Composition.TypedParts
/*用于GeneratedCode属性*/
typeof(System.CodeDom.Compiler.CodeCompiler).Assembly,//System.CodeDom.Compiler
};
var refs=来自部件中的
选择新MetadataFileReference(a.Location);
var returnList=refs.ToList();
//.NET程序集的位置
var assemblyPath=Path.GetDirectoryName(typeof(object.Assembly.Location));
/*
*添加一些必要的.NET程序集
*无法通过与上述相同的结构正确加载这些程序集,
*具体来说,是System.Runtime。
*/
添加(新的MetadataFileReference(Path.Combine(assemblyPath,“mscorlib.dll”));
添加(新的MetadataFileReference(Path.Combine(assemblyPath,“System.dll”)));
添加(新的MetadataFileReference(Path.Combine(assemblyPath,“System.Core.dll”));
添加(新的MetadataFileReference(Path.Combine(assemblyPath,“System.Runtime.dll”));
退货清单;
}
在反编译System.Runtime.dll
时,我还了解了为什么不能以任何其他方式引用它。dll是空的,它只包含一些对其他程序集的引用。因此,不能以任何其他方式引用此程序集。您的评论可能会产生误导。据我所知,是在mscorlib
中,而不是在中>System.Runtime
assembly。你说得对,我自己也算出来了。似乎没有System.Runtime
assembly,所有东西都应该在mcorslib
中可用。只是从文章和源代码中删除了行,所以它更干净了。这听起来像是在使用/NostLib
选项进行csc.你的回答帮助解决了我的问题。谢谢!你不想把它作为一个真实的答案而不是作为问题的一部分来发布吗?我几乎忽略了它…P.S.祝贺你获得2226分;)说得好!我将把它作为一个单独的答案发布。这个答案听起来很有效。你怎么看得出我引用的是PCL,是引用的mscorlib中的publickkey吗?我在问,因为我不是故意引用任何PCL的在我的应用程序中。我真的想引用mscorlib的实际桌面/IIS版本。我发现在添加System.Runtime
facade dll()时,Roslyn实际上编译了我的代码。太糟糕了,来自该帖子的程序集绑定重定向似乎无法正常工作,因为这是一个错误
+ [0] mscorlib, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
+ [1] System.Composition.AttributedModel, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [2] System.Composition.Convention, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [3] System.Composition.Hosting, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [4] System.Composition.Runtime, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [5] System.Composition.TypedParts, Version=1.0.20.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [6] Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKey=002400000480000094000000060200000024000052534131000400000100010007d1fa57c4aed9f0a32e84aa0faefd0de9e8fd6aec8f87fb03766c834c99921eb23be79ad9d5dcc1dd9ad236132102900b723cf980957fc4e177108fc607774f29e8320e92ea05ece4e821c0a5efe8f1645c4c0c93c1ab99285d622caa652c1dfad63d745d6f2de5f17e5eaf0fc4963d261c8a12436518206dc093344d5ad293 Microsoft.CodeAnalysis.AssemblyIdentity
+ [7] System, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
+ [8] System.Core, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
+ [9] System.Data, Version=4.0.0.0, Culture=neutral, PublicKey=00000000000000000400000000000000 Microsoft.CodeAnalysis.AssemblyIdentity
private IEnumerable<MetadataReference> GetGlobalReferences()
{
var assemblies = new []
{
/*Making sure all MEF assemblies are loaded*/
typeof(System.Composition.Convention.AttributedModelProvider).Assembly, //System.Composition.AttributeModel
typeof(System.Composition.Convention.ConventionBuilder).Assembly, //System.Composition.Convention
typeof(System.Composition.Hosting.CompositionHost).Assembly, //System.Composition.Hosting
typeof(System.Composition.CompositionContext).Assembly, //System.Composition.Runtime
typeof(System.Composition.CompositionContextExtensions).Assembly, //System.Composition.TypedParts
/*Used for the GeneratedCode attribute*/
typeof(System.CodeDom.Compiler.CodeCompiler).Assembly, //System.CodeDom.Compiler
};
var refs = from a in assemblies
select new MetadataFileReference(a.Location);
var returnList = refs.ToList();
//The location of the .NET assemblies
var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
/*
* Adding some necessary .NET assemblies
* These assemblies couldn't be loaded correctly via the same construction as above,
* in specific the System.Runtime.
*/
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "mscorlib.dll")));
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.dll")));
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.Core.dll")));
returnList.Add(new MetadataFileReference(Path.Combine(assemblyPath, "System.Runtime.dll")));
return returnList;
}