[英]How to get roslyn to compile when referenced assemblies have references to both mscorlib 2.0.5.0 and 4.0.0.0
我正在動態構建一個使用Microsoft.OData.Client的類,這個庫引用了mscorlib 2.0.5.0(我猜PCL)和4.0.0.0。
我想用roslyn編譯我的類,作為一個更大的程序的一部分,但我似乎無法讓它工作。 我的Roslyn編譯器代碼非常簡約
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(s);
string assemblyName = Path.GetRandomFileName();
List<MetadataReference> references = new List<MetadataReference>()
{
MetadataReference.CreateFromFile(typeof(DataServiceActionQuery).Assembly.Location),
MetadataReference.CreateFromFile(typeof(ODataAction).Assembly.Location),
MetadataReference.CreateFromFile(typeof(GeneratedCodeAttribute).Assembly.Location),
MetadataReference.CreateFromFile(typeof(IEdmModel).Assembly.Location),
MetadataReference.CreateFromFile(typeof(TimeOfDay).Assembly.Location),
MetadataReference.CreateFromFile(typeof(object).Assembly.Location),
MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location),
MetadataReference.CreateFromFile(typeof(XmlDocument).Assembly.Location),
// MetadataReference.CreateFromFile(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.0\Profile\Profile328\mscorlib.dll")
};
references.AddRange(Directory.GetFiles(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades").Select(f => MetadataReference.CreateFromFile(f)));
var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
//op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
//CSharpCompilationOptions.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
CSharpCompilation compilation = CSharpCompilation.Create(
assemblyName,
syntaxTrees: new[] { syntaxTree },
references: references,
options: op);
Assembly assembly = null;
using (var ms = new MemoryStream())
{
EmitResult result = compilation.Emit(ms);
if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
//diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);
foreach (Diagnostic diagnostic in failures)
{
Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
}
}
else
{
ms.Seek(0, SeekOrigin.Begin);
assembly = Assembly.Load(ms.ToArray());
}
}
這些是我得到的錯誤
CS0012:類型“對象”在未引用的程序集中定義。 您必須添加對程序集'mscorlib,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e,Retargetable = Yes'的引用。
CS0012:類型'XmlReader'在未引用的程序集中定義。 您必須添加對程序集'System.Xml,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e,Retargetable = Yes'的引用。
正如您在評論中預測的那樣, DesktopAssemblyIdentityComparer
就是解決方案。 但是, CSharpCompilationOptions
是不可變的,並且WithAssemblyIdentityComparer
方法返回一個新實例,因此您必須像這樣使用它:
var op = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
op = op.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default);
CSharpCompilation compilation = CSharpCompilation.Create(
assemblyName,
syntaxTrees: new[] { syntaxTree },
references: references,
options: op);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.