Tôi đang xây dựng một lớp động có sử dụng Microsoft.OData.Client thư viện này có tham chiếu đến cả mscorlib 2.0.5.0 (i đoán PCL) và 4.0.0.0. Cách lấy roslyn để biên dịch khi các assembly được tham chiếu có tham chiếu đến cả hai mscorlib 2.0.5.0 và 4.0.0.0
Tôi muốn biên dịch lớp học của mình bằng roslyn, như một phần của chương trình lớn hơn, nhưng tôi dường như không làm cho nó hoạt động. My Roslyn đang biên dịch là khá Minimalistic
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());
}
}
Đây là những lỗi tôi nhận được
CS0012: Loại 'Object' được định nghĩa trong một hội đồng đó không được tham chiếu. Bạn phải thêm tham chiếu đến assembly 'mscorlib, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes'.
CS0012: Loại 'XmlReader' được xác định trong một hội đồng không được tham chiếu. Bạn phải thêm tham chiếu vào assembly 'System.Xml, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Yes'.
Bạn đã thử thêm một lắp ráp chuyển hướng cho các hội đồng để app.config của bạn? (Và bằng cách mở rộng cho * .exe.config) – Guvante
Tôi không thể có được chuyển hướng lắp ráp để làm bất cứ điều gì - cũng không nghĩ rằng đó là vấn đề ở đây. Vấn đề là rất có thể làm thế nào tôi thiết lập trình biên dịch roslyn. – sjkp
IIRC 'DesktopAssemblyIdentityComparer' đã giải quyết vấn đề cho tôi một lần. Tuy nhiên, lưu ý rằng 'CSharpCompilationOptions' cũng không thay đổi ... bạn đã thử' op = op.WithAssemblyIdentityComparer (DesktopAssemblyIdentityComparer.Default) '? – m0sa