<PackageReference Include="Castle.Core" Version="4.1.1" />

InternalsUtil

public static class InternalsUtil
using Castle.Core.Internal; using Castle.DynamicProxy.Generators.Emitters; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; namespace Castle.DynamicProxy.Internal { public static class InternalsUtil { private static readonly IDictionary<Assembly, bool> internalsToDynProxy = new Dictionary<Assembly, bool>(); private static readonly Lock internalsToDynProxyLock = Lock.Create(); public static bool IsInternal(this MethodBase method) { if (!method.IsAssembly) { if (method.IsFamilyAndAssembly) return !method.IsFamilyOrAssembly; return false; } return true; } public static bool IsInternalToDynamicProxy(this Assembly asm) { using (IUpgradeableLockHolder upgradeableLockHolder = internalsToDynProxyLock.ForReadingUpgradeable()) { if (!internalsToDynProxy.ContainsKey(asm)) { upgradeableLockHolder.Upgrade(); if (!internalsToDynProxy.ContainsKey(asm)) { bool flag = asm.GetCustomAttributes<InternalsVisibleToAttribute>().Any(VisibleToDynamicProxy); internalsToDynProxy.Add(asm, flag); return flag; } return internalsToDynProxy[asm]; } return internalsToDynProxy[asm]; } } private static bool VisibleToDynamicProxy(InternalsVisibleToAttribute attribute) { return attribute.AssemblyName.Contains(ModuleScope.DEFAULT_ASSEMBLY_NAME); } public static bool IsAccessible(this MethodBase method) { if (method.IsPublic || method.IsFamily || method.IsFamilyOrAssembly) return true; if (method.IsFamilyAndAssembly) return true; if (method.DeclaringType.GetTypeInfo().Assembly.IsInternalToDynamicProxy() && method.IsAssembly) return true; return false; } internal static string CreateInstructionsToMakeVisible(Assembly targetAssembly) { string arg = " not"; string arg2 = "\"DynamicProxyGenAssembly2\""; if (targetAssembly.IsAssemblySigned()) { arg = ""; arg2 = (ReferencesCastleCore(targetAssembly) ? "InternalsVisible.ToDynamicProxyGenAssembly2" : "\"DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7\""); } return $"""{arg2}""{GetAssemblyName(targetAssembly)}""{arg}"""; } private static string GetAssemblyName(Assembly targetAssembly) { return targetAssembly.GetName().Name; } private static bool ReferencesCastleCore(Assembly inspectedAssembly) { return inspectedAssembly.GetReferencedAssemblies().Any((AssemblyName r) => r.FullName == Assembly.GetExecutingAssembly().FullName); } } }