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);
}
}
}