From 2080a19a76656b5d12bc8af8b4706d528d87e207 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 25 Sep 2020 11:55:09 +0300 Subject: [PATCH 1/2] Support internal entity classes --- .../StaticProxyFactoryFixture.cs | 33 +++++++++++++++++++ .../Proxy/FieldInterceptorProxyBuilder.cs | 5 +++ .../Proxy/NHibernateProxyBuilder.cs | 3 ++ 3 files changed, 41 insertions(+) diff --git a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs index da3c5cde84f..dd7cd6931aa 100644 --- a/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs +++ b/src/NHibernate.Test/StaticProxyTest/StaticProxyFactoryFixture.cs @@ -37,6 +37,13 @@ public class InternalInterfaceTestClass : IInternal public virtual int Id { get; set; } } + [Serializable] + internal class InternalTestClass + { + int Id { get; set; } + string Name { get; set; } + } + public interface IPublic { int Id { get; set; } @@ -517,6 +524,32 @@ public void VerifyProxyForAbstractClass() Assert.That(proxy, Is.Not.Null); Assert.That(proxy, Is.InstanceOf()); Assert.That(proxy, Is.InstanceOf()); +#if NETFX + }); +#endif + } + + [Test] + public void VerifyProxyForInternalClass() + { + var factory = new StaticProxyFactory(); + factory.PostInstantiate( + typeof(InternalTestClass).FullName, + typeof(InternalTestClass), + new HashSet { typeof(INHibernateProxy) }, + null, null, null, true); + +#if NETFX + VerifyGeneratedAssembly( + () => + { +#endif + var proxy = factory.GetProxy(1, null); + Assert.That(proxy, Is.Not.Null); + Assert.That(proxy, Is.InstanceOf()); + + Assert.That(factory.GetFieldInterceptionProxy(), Is.InstanceOf()); + #if NETFX }); #endif diff --git a/src/NHibernate/Proxy/FieldInterceptorProxyBuilder.cs b/src/NHibernate/Proxy/FieldInterceptorProxyBuilder.cs index 29bd50d4ef4..314644f121c 100644 --- a/src/NHibernate/Proxy/FieldInterceptorProxyBuilder.cs +++ b/src/NHibernate/Proxy/FieldInterceptorProxyBuilder.cs @@ -56,6 +56,11 @@ public static TypeInfo CreateProxyType(System.Type baseType) var name = new AssemblyName(assemblyName); var assemblyBuilder = ProxyBuilderHelper.DefineDynamicAssembly(AppDomain.CurrentDomain, name); + +#if NETFX || NETCOREAPP2_0 + if (!baseType.IsVisible) + ProxyBuilderHelper.GenerateInstanceOfIgnoresAccessChecksToAttribute(assemblyBuilder, baseType.Assembly.GetName().Name); +#endif var moduleBuilder = ProxyBuilderHelper.DefineDynamicModule(assemblyBuilder, moduleName); const TypeAttributes typeAttributes = TypeAttributes.AutoClass | TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.BeforeFieldInit; diff --git a/src/NHibernate/Proxy/NHibernateProxyBuilder.cs b/src/NHibernate/Proxy/NHibernateProxyBuilder.cs index 607e548c4f0..0c7ed9794ae 100644 --- a/src/NHibernate/Proxy/NHibernateProxyBuilder.cs +++ b/src/NHibernate/Proxy/NHibernateProxyBuilder.cs @@ -83,6 +83,9 @@ public TypeInfo CreateProxyType(System.Type baseType, IReadOnlyCollection !i.IsVisible); #endif From 7d76a243b9989b4809674cbc53ed43f451f9f103 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 25 Sep 2020 12:28:34 +0300 Subject: [PATCH 2/2] Avoid possible duplicate attribute --- src/NHibernate/Proxy/NHibernateProxyBuilder.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/NHibernate/Proxy/NHibernateProxyBuilder.cs b/src/NHibernate/Proxy/NHibernateProxyBuilder.cs index 0c7ed9794ae..96c530f940c 100644 --- a/src/NHibernate/Proxy/NHibernateProxyBuilder.cs +++ b/src/NHibernate/Proxy/NHibernateProxyBuilder.cs @@ -78,14 +78,12 @@ public TypeInfo CreateProxyType(System.Type baseType, IReadOnlyCollection !i.IsVisible) - .Select(i => i.Assembly.GetName().Name) - .Distinct(); + new[] {baseType} + .Concat(interfaces).Where(i => !i.IsVisible) + .Select(i => i.Assembly.GetName().Name) + .Distinct(); foreach (var a in assemblyNamesToIgnoreAccessCheck) ProxyBuilderHelper.GenerateInstanceOfIgnoresAccessChecksToAttribute(assemblyBuilder, a); - - if (!baseType.IsVisible && !baseType.IsInterface) - ProxyBuilderHelper.GenerateInstanceOfIgnoresAccessChecksToAttribute(assemblyBuilder, baseType.Assembly.GetName().Name); #else interfaces.RemoveWhere(i => !i.IsVisible); #endif