Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serializing a type created in a ScriptEngine session

Consider the following console application:

using System;
using System.IO;
using System.Text;
using System.Xml.Serialization;
using System.Reflection.Emit;
using System.Reflection;
using Roslyn.Scripting.CSharp;

class Program
{
    static void Main(string[] args)
    {
        var dynAssembly = AssemblyBuilder
            .DefineDynamicAssembly(
            new AssemblyName("TestAssembly"),
            AssemblyBuilderAccess.RunAndSave);
        var dynModule = dynAssembly.DefineDynamicModule("TestModule");
        var typeBuilder = dynModule.DefineType("Test", TypeAttributes.Public);
        var dynamicType = typeBuilder.CreateType();
        var serializer = new XmlSerializer(dynamicType);
        var sBuilder = new StringBuilder();
        serializer.Serialize(
            new StringWriter(sBuilder),
            Activator.CreateInstance(dynamicType));
        Console.WriteLine(sBuilder.ToString());

        var engine = new ScriptEngine();
        engine.AddReference(Type.GetType("System.Object").Assembly.Location);
        engine.ImportNamespace("System");
        var roslynType = engine
            .CreateSession()
            .Execute<Type>("public class Test{public Test(){}};typeof(Test)");
        serializer = new XmlSerializer(roslynType); // FileNotFoundException
    }
}

When trying to instantiate a XmlSerializer and passing the roslynType as argument, the following runtime exception occurs:

Could not load file or assembly 'ℛ*875699ae-0282-43b7-8ca3-a2f223a3d567-#1UD.XmlSerializers' or one of its dependencies. The filename, directory name, or volume label syntax is incorrect.

The FusionLog displays the following:

=== Pre-bind state information ===
LOG: User = ***
LOG: DisplayName = ℛ*12d7c994-3636-4081-93d3-6bfe43cc8988-#1UD.XmlSerializers
 (Partial)
WRN: Partial binding information was supplied for an assembly:
WRN: Assembly Name: ℛ*12d7c994-3636-4081-93d3-6bfe43cc8988-#1UD.XmlSerializers | 
     Domain ID: 1
WRN: A partial bind occurs when only part of the assembly display name is provided.
WRN: This might result in the binder loading an incorrect assembly.
WRN: It is recommended to provide a fully specified textual identity for the 
     assembly,
WRN: that consists of the simple name, version, culture, and public key token.
WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more 
     information and common solutions to this issue.
LOG: Appbase = ***
LOG: Initial PrivatePath = NULL
Calling assembly : System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: ***
LOG: Using host configuration file: 
LOG: Using machine configuration file from 
     C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, 
     or location-based assembly bind).
LOG: Attempting download of new URL 
     file:///c:/users/userName/documents/visual studio 2012/
     Projects/ConsoleApplication147/ConsoleApplication147/bin/Debug/
     ℛ*12d7c994-3636-4081-93d3-6bfe43cc8988-#1UD.XmlSerializers.DLL.
ERR: A fatal error occurred when retrieving next codebase for download (hr = 0x8007007b).

Is it possible to serialize an instance of the roslynType? If so, what are the steps that I'm missing? Is there an completely different approach?

like image 596
Alex Filipovici Avatar asked Sep 04 '26 11:09

Alex Filipovici


1 Answers

You are running into this problem.

One of the other answers on that page suggests using the following to instantiate your XmlSerializer.

var serializer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];
like image 157
shamp00 Avatar answered Sep 05 '26 23:09

shamp00



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!