Laden einer assembly erzeugt durch die Roslyn-compiler
Ich bin generieren Greeter.dll Verwendung des Roslyn-compiler. Mein problem tritt auf, versuchen zu laden, die DLL-Datei.
Hier der code:
using System;
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;
using System.IO;
using System.Reflection;
using System.Linq;
namespace LoadingAClass
{
class Program
{
static void Main(string[] args)
{
var syntaxTree = SyntaxTree.ParseCompilationUnit(@"
class Greeter
{
static void Greet()
{
Console.WriteLine(""Hello, World"");
}
}");
var compilation = Compilation.Create("Greeter.dll",
syntaxTrees: new[] { syntaxTree },
references: new[] {
new AssemblyFileReference(typeof(object).Assembly.Location),
new AssemblyFileReference(typeof(Enumerable).Assembly.Location),
});
Assembly assembly;
using (var file = new FileStream("Greeter.dll", FileMode.Create))
{
EmitResult result = compilation.Emit(file);
}
assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), @"Greeter.dll"));
Type type = assembly.GetType("Greeter");
var obj = Activator.CreateInstance(type);
type.InvokeMember("Greet",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
obj,
null);
Console.WriteLine("<ENTER> to continue");
Console.ReadLine();
}
}
//Thanks, http://blogs.msdn.com/b/csharpfaq/archive/2011/11/23/using-the-roslyn-symbol-api.aspx
}
Tritt die Fehlermeldung auf die Zeile assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), @"Greeter.dll"));
und liest
Im Modul wurde ein Assemblymanifest erwartet. (Ausnahme von HRESULT: 0x80131018)
Was übersetzt in etwa
Einem Assemblymanifest erwartet wurde, in das Modul.
Weiß jemand, was fehlt mir hier?
- Sie haben mehrere Fehler in Ihrem code. Anscheinend ist Sie schon, dachte Sie, aber benötigen eine PDB-war nicht unter Ihnen). Das nächste mal, betrachten
result.Diagnostics
um herauszufinden, was das problem ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich haben gewesen das hinzufügen Roslyn Unterstützung der O2 Plarform und hier ist, wie können Sie die Roslyn-Unterstützung zu kompilieren (code), erstellen (und Montage) und invoke (seine Methode) einer Zeile code:
Hier ist eine version, die ausgeführt wird, ein code-snippet, das aussieht wie deins (ich habe ein return-Wert):
Für ein paar weitere details und screenshots, wie das aussieht, sehen Sie in diesem blog-post: 1 Zeile zum kompilieren, erstellen und ausführen von: O2 Skript zu verwenden, Roslyn Dynamisch kompilieren und ausführen einer Methode
UPDATE: sehen http://blog.diniscruz.com/search/label/Roslyn für eine große Anzahl von Roslyn Verwandte Beiträge und tools (erstellt mit der O2-Plattform)
Ich stolperte über dieses, und, obwohl Sie haben eine akzeptierte Antwort, ich glaube nicht, dass es hilfreich ist, im Allgemeinen. So, ich lass das hier für zukünftig Suchende wie mich.
Das problem mit dem code ist zwei Dinge, die Sie gefunden haben, suchen Sie in der Rückgabewert von
Wenn man sich die Eigenschaften auf die EmitResult Objekt, Sie hätten gefunden, es waren 2 Fehler in den Ergebnissen.Diagnose-Mitglied.
So, um das problem zu beheben
1. Sie müssen daneben die Ausgabe als eine dll
2. Sie müssen hinzufügen " using System;", um den code, den Sie übergeben haben, in der API oder sagen Sie 'System.Console.WriteLine'
Dem folgenden code funktioniert die änderungen zu beheben, diese beiden Probleme:
Dieser code hat wunderbar funktioniert:
Gibt es eine neue API für die Referenzen, die wie folgt aussieht:
Dies ist mit den neuesten Roslyn-CTP 2012 im Sept...
Stellt sich heraus, ich brauchte, um zu erstellen Sie eine pdb-Datei.