using System.Reflection; using System.Reflection.Emit; using Nanoray.Pintail; namespace StardewModdingAPI.Framework.Reflection { /// <inheritdoc /> internal class InterfaceProxyFactory : IInterfaceProxyFactory { /********* ** Fields *********/ /// <summary>The underlying proxy type builder.</summary> private readonly IProxyManager<string> ProxyManager; /********* ** Public methods *********/ /// <summary>Construct an instance.</summary> public InterfaceProxyFactory() { AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName($"StardewModdingAPI.Proxies, Version={this.GetType().Assembly.GetName().Version}, Culture=neutral"), AssemblyBuilderAccess.Run); ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("StardewModdingAPI.Proxies"); this.ProxyManager = new ProxyManager<string>(moduleBuilder, new ProxyManagerConfiguration<string>( proxyPrepareBehavior: ProxyManagerProxyPrepareBehavior.Eager, proxyObjectInterfaceMarking: ProxyObjectInterfaceMarking.Disabled )); } /// <inheritdoc /> public TInterface CreateProxy<TInterface>(object instance, string sourceModID, string targetModID) where TInterface : class { return this.ProxyManager.ObtainProxy<string, TInterface>(instance, targetContext: targetModID, proxyContext: sourceModID); } } }