Merge pull request #25 from yfital/interception_works_once

Fix multiple intreceptors issue due to .net core logic change
This commit is contained in:
Eugene Sadovoi 2019-02-06 16:47:56 -05:00 коммит произвёл GitHub
Родитель 0ae00b045c dcb662c459
Коммит 595fc621f4
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
5 изменённых файлов: 27 добавлений и 42 удалений

Просмотреть файл

@ -1,20 +0,0 @@

using System;
using System.Reflection.Emit;
namespace Unity.Interception.Interceptors.InstanceInterceptors.InterfaceInterception
{
public partial class InterfaceInterceptorClassGenerator
{
private static ModuleBuilder GetModuleBuilder()
{
string moduleName = Guid.NewGuid().ToString("N");
#if DEBUG_SAVE_GENERATED_ASSEMBLY
return AssemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".dll", true);
#else
return AssemblyBuilder.DefineDynamicModule(moduleName);
#endif
}
}
}

Просмотреть файл

@ -176,7 +176,7 @@ namespace Unity.Interception.Interceptors.InstanceInterceptors.InterfaceIntercep
{ {
TypeAttributes newAttributes = TypeAttributes.Public | TypeAttributes.Class; TypeAttributes newAttributes = TypeAttributes.Public | TypeAttributes.Class;
ModuleBuilder moduleBuilder = GetModuleBuilder(); ModuleBuilder moduleBuilder = InterceptorClassGenerator.CreateModuleBuilder(AssemblyBuilder);
_typeBuilder = moduleBuilder.DefineType(CreateTypeName(), newAttributes); _typeBuilder = moduleBuilder.DefineType(CreateTypeName(), newAttributes);
_mainInterfaceMapper = DefineGenericArguments(); _mainInterfaceMapper = DefineGenericArguments();

Просмотреть файл

@ -0,0 +1,25 @@
using System;
using System.Collections.Concurrent;
using System.Reflection.Emit;
namespace Unity.Interception.Interceptors
{
public static class InterceptorClassGenerator
{
private static readonly ConcurrentDictionary<AssemblyBuilder, ModuleBuilder> ModuleByAssembly =
new ConcurrentDictionary<AssemblyBuilder, ModuleBuilder>();
public static ModuleBuilder CreateModuleBuilder(AssemblyBuilder assemblyBuilder)
{
return ModuleByAssembly.GetOrAdd(assemblyBuilder, assembly =>
{
string moduleName = Guid.NewGuid().ToString("N");
#if DEBUG_SAVE_GENERATED_ASSEMBLY
return AssemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".dll", true);
#else
return assembly.DefineDynamicModule(moduleName);
#endif
});
}
}
}

Просмотреть файл

@ -1,20 +0,0 @@

using System;
using System.Reflection.Emit;
namespace Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodInterception.InterceptingClassGeneration
{
public partial class InterceptingClassGenerator
{
private static ModuleBuilder GetModuleBuilder()
{
string moduleName = Guid.NewGuid().ToString("N");
#if DEBUG_SAVE_GENERATED_ASSEMBLY
return AssemblyBuilder.DefineDynamicModule(moduleName, moduleName + ".dll", true);
#else
return AssemblyBuilder.DefineDynamicModule(moduleName);
#endif
}
}
}

Просмотреть файл

@ -214,7 +214,7 @@ namespace Unity.Interception.Interceptors.TypeInterceptors.VirtualMethodIntercep
Type baseClass = GetGenericType(_typeToIntercept); Type baseClass = GetGenericType(_typeToIntercept);
ModuleBuilder moduleBuilder = InterceptingClassGenerator.GetModuleBuilder(); ModuleBuilder moduleBuilder = InterceptorClassGenerator.CreateModuleBuilder(AssemblyBuilder);
_typeBuilder = moduleBuilder.DefineType( _typeBuilder = moduleBuilder.DefineType(
"DynamicModule.ns.Wrapped_" + _typeToIntercept.Name + "_" + Guid.NewGuid().ToString("N"), "DynamicModule.ns.Wrapped_" + _typeToIntercept.Name + "_" + Guid.NewGuid().ToString("N"),
newAttributes, newAttributes,