.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.
我在交叉装配/友元装配类型可见性方面遇到问题。
我有以下程序(我签名/强名)。它告诉 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.