Какие `[InternalsVisibleTo]` для сборок.NET Framework и.NET Standard / Core Framework?
У меня проблема с видимостью типа перекрестная сборка / сборка друга.
У меня есть следующая программа (которую я подписываю / строгое имя). Это говорит Castle DynamicProxy (я использую версию 4.2.1 Castle.Core
Пакет NuGet) для создания прокси для моего интерфейса IFoo
, Я также уточняю, что мой internal class InterfaceProxyBase
должен быть базовым классом для типа прокси.
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]
атрибут для собственной сборки / сборок фреймворка. Моя программа (на самом деле библиотека классов) нацелена как на.NET 4.5, так и на.NET Standard 1.3.
Который [assembly: InternalsVisibleTo]
атрибуты, которые мне нужны (включая точные открытые ключи), чтобы мой код работал для упомянутых платформ / целей?
PS: я знаю, что могу обойти проблему, просто сделав InterfaceProxyBase
общественности и скрывая это с [EditorBrowsable(Never)]
ради внешности, но я действительно не хочу обнародовать этот внутренний тип, если не буду этого делать.
PPS: Если обнародование внутренних компонентов для сборок фреймворка действительно плохая идея, с точки зрения безопасности, пожалуйста, дайте мне знать, тогда я с радостью пересмотрю свой подход.
1 ответ
Вы должны установить InternalsVisibleTo
за DynamicProxyGenAssembly2
:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
DynamicProxyGenAssembly2
это временная сборка, построенная Castle.DynamicProxy
, Эта сборка содержит сгенерированный тип прокси, который наследуется от вашего InterfaceProxyBase
, Вот почему DynamicProxyGenAssembly2
должен иметь доступ к InterfaceProxyBase
тип. Возможные варианты: добавление InternalsVisibleTo
атрибут или создание InterfaceProxyBase
общественности.