序列化在ScriptEngine会话中创建的类型
本文关键字:创建 类型 会话 ScriptEngine 序列化 | 更新日期: 2023-09-27 18:18:24
考虑以下控制台应用程序:
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
}
}
当尝试实例化XmlSerializer
并将roslynType
作为参数传递时,会发生以下运行时异常:
无法加载文件或程序集"ℛ* 875699 ae - 0282 - 43 - b7 - 8 - ca3 a2f223a3d567 # 1美圆。XmlSerializers’或一个它的依赖关系。文件名、目录名或卷标语法错误
FusionLog显示如下信息:
=== 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).
有可能序列化roslynType
的实例吗?如果有,我错过了哪些步骤?有没有完全不同的方法?
你遇到这个问题了。
该页上的另一个答案建议使用以下方法实例化您的XmlSerializer
。
var serializer = XmlSerializer.FromTypes(new[] { typeof(MyType) })[0];