Подтвердить что ты не робот

Есть ли функция сортировки подстановочных знаков, чтобы сделать внутренности видимыми для сборок, которые соответствуют общему имени сборки?

Существует ли какая-либо подстановочная функция для того, чтобы сделать внутренности видимыми для сборок, имеющих общую общую сборку (мой английский-fu не дает мне имени)?

Например, The.Empire является основным именем всех сборок. Я пробовал The.Empire.*, но безрезультатно.

Сборка A

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.*")]


namespace The.Empire
{
    internal static class Constants
    {
        internal readonly static string CommonId = "Luke";
    }
}

Сборка B

namespace The.Empire.Strikes
{
    public class Mate
    {
        public void AccessSomething()
        {
            Console.WriteLine("{0}", Constants.CommonId); // inaccessible
        }
    }
}

Сборка C

namespace The.Empire.Back
{
    public class Mate
    {
        public void AccessSomething()
        {
            Console.WriteLine("{0}", Constants.CommonId); // inaccessible
        }
    }
}

Возможно ли это? По аналогии наследования ООП, что-то похожее на protected, только разработчик имеет доступ к защищенным

Это не свободная связь, если я помещаю конкретное имя сборки на InternalsVisibleTo. Другие исполнители Ассамблеи А не могут быть удовлетворены, если я не перекомпилирую AssemblyA

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.Strikes")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("The.Empire.Back")]
4b9b3361

Ответ 1

Документация предполагает, что единственные способы указать несколько сборок - либо с несколькими атрибутами, либо с несколькими именами в одном атрибуте:

Вы можете определить несколько сборок узлов двумя способами. Они могут появляться как индивидуальные атрибуты уровня сборки... [или они] также могут появляться с отдельными тегами InternalsVisibleToAttribute, но с одной сборкой ключевое слово.

То есть:

[assembly:InternalsVisibleTo("Friend1a")]
[assembly:InternalsVisibleTo("Friend1b")]

или

[assembly:InternalsVisibleTo("Friend2a"), 
          InternalsVisibleTo("Friend2b")]

Я не думаю, что вы хотите, и, возможно, намеренно так. Чтобы ваши внутренние детали были видны на другой сборке, это то, что нужно использовать экономно, поскольку оно позволяет больше сочетания, чем могло бы быть желательным. Таким образом, вам должно быть сложно показать свои внутренние детали, если вы не хотели, чтобы они показывались на данном собрании. Wildcards активно работает против этого.

Ваш лучший вариант (если вы не хотите использовать несколько атрибутов) заключается в том, чтобы: а) объединить сборки, чтобы они могли просто поделиться internal или b) сделать определенные ключевые internal члены public ( или protected) и сделать те точки интеграции для других сборок.