Какие `[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 общественности.

Другие вопросы по тегам