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?
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];
User contributions licensed under CC BY-SA 3.0