referanslar olduğunda derlemeye Roslyn almak nasıl (i PCL'yi ve 4.0.0.0'ı tahmin edin. başvurulan derlemeler Dinamik Microsoft.OData.Client bu kütüphane hem mscorlib 2.0.5.0 başvurular var kullanan bir sınıf inşa ediyorum hem mscorlib 2.0.5.0 ve 4.0.0.0
Sınıfımı daha büyük bir programın parçası olarak roslyn ile derlemek istiyorum, ancak işe yaramaya gelemiyorum. type 'Nesne' başvurulan olmayan bir montaj tanımlanır: My Roslyn derleyici kod
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());
}
}
Bunlar
CS0012 olsun hatalardır oldukça minimalist olduğunu. Sen 'Sürüm = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Evet, mscorlib' montaj bir başvuru eklemeniz gerekir.
CS0012: türü 'XmlReader' başvurulan olmayan bir montaj tanımlanır. Sen montaj 'System.XML, Version = 2.0.5.0, nötr Kültür =, PublicKeyToken = 7cec85d7bea7798e, Retargetable = Evet' bir başvuru eklemeniz gerekir.
bir derleme app.config için bu derlemeler için yönlendirmesi ekleyerek denediniz? (Ve * .exe.config uzantısına göre) – Guvante
Ben herhangi bir şey yapmak için derleme yönlendirmesi alamıyorum - aynı zamanda burada sorun olduğunu düşünmüyorum. Sorun büyük olasılıkla roslyn derleyicisini nasıl kuracağım. – sjkp
IIRC 'DesktopAssemblyIdentityComparer' bir kez benim için sorunu çözdü. CSharpCompilationOptions' yanı değişmez 'Ancak unutmayın ki, ... sen' op = op.WithAssemblyIdentityComparer (DesktopAssemblyIdentityComparer.Default) 'denediniz mi? – m0sa