Hvordan legger du referanser til typer samlet i en minnestrøm ved hjelp av Roslyn?

stemmer
5

Som innspill til samling har jeg en streng med følgende kode i det:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public string EmailAddress { get; set; }
}

Jeg har følgende kode, merk kommentaren på [01]. Hensikten her er å ta en streng som inneholder en klasse (fra this.Sourceog avgir koden for montering inn i en MemoryStream.

var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
var assemblyName = Guid.NewGuid().ToString();
var syntaxTrees = CSharpSyntaxTree.ParseText(this.Source);

// build references up
var references = new List<MetadataReference>();
//[01] references.Add(System.dll)); 

// set up compilation
var compilation = CSharpCompilation.Create(assemblyName)
    .WithOptions(new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
    .AddReferences(references)
    .AddSyntaxTrees(syntaxTrees);

// build the assembly
Assembly assembly;
using (var stream = new MemoryStream())
{
    // this is broked...
    EmitResult compileResult = compilation.Emit(stream);
    // [02] we get here, with diagnostic errors (check compileResult.Diagnostics)
    assembly = Assembly.Load(stream.GetBuffer());
}

At [02]jeg får et BadImageFormatunntak, med følgende i compileResult.Diagnostics:

[0]: warning CS8021: No value for RuntimeMetadataVersion found. No assembly containing System.Object was found nor was a value for RuntimeMetadataVersion specified through options.
[1]: (2,18): error CS0518: Predefined type 'System.Object' is not defined or imported
[2]: (4,16): error CS0518: Predefined type 'System.String' is not defined or imported
[3]: (4,40): error CS0518: Predefined type 'System.Void' is not defined or imported
[4]: (5,16): error CS0518: Predefined type 'System.String' is not defined or imported
[5]: (5,39): error CS0518: Predefined type 'System.Void' is not defined or imported
[6]: (6,16): error CS0518: Predefined type 'System.Int32' is not defined or imported
[7]: (6,31): error CS0518: Predefined type 'System.Void' is not defined or imported
[8]: (7,16): error CS0518: Predefined type 'System.String' is not defined or imported
[9]: (7,43): error CS0518: Predefined type 'System.Void' is not defined or imported
[10]: (2,18): error CS1729: 'object' does not contain a constructor that takes 0 arguments

Hvis jeg legger en using System;til starten av koden får jeg følgende feilmelding:

error CS0246: The type or namespace name 'System' could not be found (are you missing a using directive or an assembly reference?)

Det fører meg til å tro at jeg ikke har tilgang til systemet fra der jeg sitter, det er derfor jeg stumpet i at pseudo-kode references.Add(System.dll));. Det er åpenbart feil, men det er min hensikt.

For en liten ytterligere informasjon, er hensikten her å deretter opprette en forekomst av den genererte typen dynamisk og gi verdier for egenskapene.

Hva er den riktige måten å gjøre referanser tilgjengelig til kompilatoren?

Eller er det en annen tilnærming for å utarbeide en klasse som dette (fra en streng inngang)?

Publisert på 08/11/2014 klokken 22:29
kilden bruker
På andre språk...                            


2 svar

stemmer
4

Ring AssemblyMetadata.CreateFromFile(path)-metoden , og passere typeof(object).Assembly.Location(eller andre sammenstillinger).

Svarte 08/11/2014 kl. 23:14
kilden bruker

stemmer
0

Du kan bruke denne teknikken for å få full sti til forsamlingen

var assemblyFullPath = typeof(object).Assembly.Location);

slik at du kan ende opp med dette:

references.Add(new MetadataFileReference(typeof(object).Assembly.Location)));

OPPDATER

Du kan prøve å bruke:

PortableExecutableReference MetadataReference.CreateFromImage(
        ImmutableArray<byte> peImage,
        MetadataReferenceProperties properties = default(MetadataReferenceProperties),
        DocumentationProvider documentation = null,
        string filePath = null)
Svarte 08/11/2014 kl. 22:35
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more