.NET Framework 和 .NET Standard/Core 框架程序集的哪个“[InternalsVisibleTo]”?

Which `[InternalsVisibleTo]` for .NET Framework and .NET Standard / Core framework assemblies?

我在交叉装配/友元装配类型可见性方面遇到问题。

我有以下程序(我签名/强名)。它告诉 Castle DynamicProxy(我使用的是 Castle.Core NuGet 包的 4.2.1 版)为我的界面 IFoo 创建一个代理。我还指定我的 internal class InterfaceProxyBase 应该是代理类型的基础 class。

DynamicProxy 然后使用 System.Reflection.Emit 创建代理类型。但显然,System.Reflection.Emit.TypeBuilder 无法访问 InterfaceProxyBase.

// [assembly: InternalsVisibleTo("?")]
//                               ^^^
// What do I need here for my program to work both on the .NET Framework 4.5+
// and on .NET Core / .NET Standard 1.3+?

using Castle.DynamicProxy;

class Program
{
    static void Main()
    {
        var generator = new ProxyGenerator();

        var options = new ProxyGenerationOptions
            {
                BaseTypeForInterfaceProxy = typeof(InterfaceProxyBase)  // <--
            };

        var proxy = generator.CreateInterfaceProxyWithoutTarget(
                typeof(IFoo),
                options,
                new Interceptor());
    }
}

public interface IFoo { }

internal abstract class InterfaceProxyBase { }

internal sealed class Interceptor : IInterceptor
{
    public void Intercept(IInvocation invocation) { }
}

Unhandled Exception: System.TypeLoadException: Access is denied: 'InterfaceProxyBase'.
   at System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type)
   ...
   at Castle.DynamicProxy.ProxyGenerator.CreateInterfaceProxyWithoutTarget(Type interfaceToProxy, ProxyGenerationOptions options, IInterceptor[] interceptors)
   at Program.Main() in Program.cs

所以,显然我需要框架自己的程序集的 [assembly: InternalsVisibleTo] 属性。我的程序(实际上是 class 库)同时针对 .NET 4.5 和 .NET Standard 1.3。

我需要哪些 [assembly: InternalsVisibleTo] 属性(包括精确的 public 键)才能使我的代码适用于上述平台/目标?


P.S.: 我知道我可以通过 InterfaceProxyBase public 并为了美观用 [EditorBrowsable(Never)] 隐藏它来绕过这个问题,但我真的不如果不需要,我不想制作这种内部类型 public。

P.P.S.: 如果在安全方面对框架程序集进行内部 public 是一个非常糟糕的主意,请告诉我,然后我会很乐意重新考虑我的方法。

您应该为 DynamicProxyGenAssembly2 设置 InternalsVisibleTo:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]

DynamicProxyGenAssembly2 是由Castle.DynamicProxy 构建的临时程序集。此程序集包含从您的 InterfaceProxyBase 继承的生成的代理类型。这就是为什么 DynamicProxyGenAssembly2 应该可以访问 InterfaceProxyBase 类型。可能的选项是添加 InternalsVisibleTo 属性或制作 InterfaceProxyBase public.