You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.2 KiB
79 lines
2.2 KiB
4 years ago
|
#if !UNITY_WSA
|
||
|
#if !NET_STANDARD_2_0
|
||
|
|
||
|
using System;
|
||
|
using System.Reflection;
|
||
|
using System.Reflection.Emit;
|
||
|
|
||
|
namespace MessagePack.Internal
|
||
|
{
|
||
|
internal class DynamicAssembly
|
||
|
{
|
||
|
#if NET_35
|
||
|
readonly string moduleName;
|
||
|
#endif
|
||
|
readonly AssemblyBuilder assemblyBuilder;
|
||
|
readonly ModuleBuilder moduleBuilder;
|
||
|
|
||
|
// don't expose ModuleBuilder
|
||
|
// public ModuleBuilder ModuleBuilder { get { return moduleBuilder; } }
|
||
|
|
||
|
readonly object gate = new object();
|
||
|
|
||
|
public DynamicAssembly(string moduleName)
|
||
|
{
|
||
|
#if NET_35
|
||
|
this.moduleName = moduleName;
|
||
|
this.assemblyBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(moduleName), AssemblyBuilderAccess.RunAndSave);
|
||
|
this.moduleBuilder = assemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".dll");
|
||
|
#else
|
||
|
#if NETSTANDARD
|
||
|
this.assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(moduleName), AssemblyBuilderAccess.Run);
|
||
|
#else
|
||
|
this.assemblyBuilder = System.AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(moduleName), AssemblyBuilderAccess.Run);
|
||
|
#endif
|
||
|
|
||
|
this.moduleBuilder = assemblyBuilder.DefineDynamicModule(moduleName);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
// requires lock on mono environment. see: https://github.com/neuecc/MessagePack-CSharp/issues/161
|
||
|
|
||
|
public TypeBuilder DefineType(string name, TypeAttributes attr)
|
||
|
{
|
||
|
lock (gate)
|
||
|
{
|
||
|
return moduleBuilder.DefineType(name, attr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent)
|
||
|
{
|
||
|
lock (gate)
|
||
|
{
|
||
|
return moduleBuilder.DefineType(name, attr, parent);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public TypeBuilder DefineType(string name, TypeAttributes attr, Type parent, Type[] interfaces)
|
||
|
{
|
||
|
lock (gate)
|
||
|
{
|
||
|
return moduleBuilder.DefineType(name, attr, parent, interfaces);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if NET_35
|
||
|
|
||
|
public AssemblyBuilder Save()
|
||
|
{
|
||
|
assemblyBuilder.Save(moduleName + ".dll");
|
||
|
return assemblyBuilder;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
#endif
|