Друг блоки в C#

Я пытаюсь создать некоторого 'друга блоки' использование [InternalsVisibleTo ()] атрибут, но я, может казаться, не получаю его работа. Я следовал инструкциям Microsoft для создания друга со знаком блоки, и я не вижу, где я иду не так, как надо. Таким образом, я детализирую свои шаги здесь, и надо надеяться кто-то может определить мою преднамеренную ошибку...?

Создайте ключ строгого имени и извлеките открытый ключ, таким образом:

-k StrongNameKey sn
sn-p public.pk
sn-tp public.pk

Добавьте ключ строгого имени к каждому проекту и позвольте подписаться.

Создайте проект под названием Внутренности и класс с внутренним свойством:

namespace Internals
{
    internal class ClassWithInternals
    {
        internal string Message { get; set; }
        public ClassWithInternals(string m)
        {
            Message = m;
        }
    }
}

Создайте другой проект под названием TestInternalsVisibleTo:

namespace TestInternalsVisibleTo
{
    using Internals;

    static class Program
    {
        /// 
        /// The main entry point for the application.
        /// 
        [STAThread]
        static void Main()
        {
            var c = new Internals.ClassWithInternals("Test");
            Console.WriteLine(c.Message);
        }
    }
}

Отредактируйте файл AssemblyInfo.cs для проекта Внутренностей и добавьте необходимый атрибут:

[assembly: AssemblyTitle("AssemblyWithInternals")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Microsoft")]
[assembly: AssemblyProduct("Internals")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: ComVisible(false)]
[assembly: Guid("41c590dc-f555-48bc-8a94-10c0e7adfd9b")]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

[assembly: InternalsVisibleTo("TestInternalsVisibleTo PublicKey=002400000480000094000000060200000024000052534131000400000100010087953126637ab27cb375fa917c35b23502c2994bb860cc2582d39912b73740d6b56912c169e4a702bedb471a859a33acbc8b79e1f103667e5075ad17dffda58988ceaf764613bd56fc8f909f43a1b177172bc4143c96cf987274873626abb650550977dcad1bb9bfa255056bb8d0a2ec5d35d6f8cb0a6065ec0639550c2334b9")]

И наконец... сборка!

Я получаю следующие ошибки:

ошибка CS0122: 'Внутренности. ClassWithInternals недоступен из-за его уровня защиты
ошибка CS1729: 'Внутренности. ClassWithInternals не содержит конструктора, который берет 1 ошибку аргументов CS1061: 'Внутренности. ClassWithInternals не содержит определение для 'сообщения' и никакого дополнительного метода 'сообщение', принимающее первый аргумент типа 'Внутренности. ClassWithInternals мог быть найден (Вы пропускаете директиву использования или ссылку на сборку?)

В основном это - как будто я не использовал InternalsVisibleTo attrbute. Теперь, я не собираюсь попадать в прерывание обвинения инструментов, поэтому что произошло здесь? Кто-либо?

12
задан Tim Long 30 April 2010 в 17:58
поделиться

1 ответ

В атрибуте InternalsVisibleTo после имени сборки отсутствует запятая.

Должно быть:

[assembly: InternalsVisibleTo("TestInternalsVisibleTo, PublicKey=....];

Ссылки на сборки могут быть привередливыми, и, к сожалению, компилятор не пытается их проверить, когда они появляются внутри атрибутов в виде строк. Если вы неправильно написали ссылку на сборку или предоставили неверный ключ - все будет скомпилировано, но просто не будет работать.

15
ответ дан 2 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: