Использование членов InternalsVisibleToAttribute от доступа внутреннего контроля

Оригинальная ссылка: http://www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html

В предыдущей статье, для того, чтобы решить уровень доступа членства, я использовал адаптер объекта, так что клиент не может легко изменять свойства объекта. Пользователь замечает, что моя практика по кругу, в самом деле, этот метод не может помешать клиенту намеренно, чтобы изменить свойства объекта, но в определенной степени, играл защитный эффект: по крайней мере, уменьшить вероятность неправильного использования секс.

Сегодня, на самом деле, мы обнаружили, что тот же эффект может быть достигнут с System.Runtime.CompilerServices.InternalsVisibleToAttribute этой функции. Следующие шаги.

  1. Это предположение ExposedSetter.Library SourcedAggregationRoot библиотека классов содержит атрибут класса, имеющий внутренние сеттер. Во-первых, ExposedSetter.Library для цифровых подписей. Щелкните правой кнопкой мыши на проекте ExposedSetter.Library выберите «Свойства». Выберите «Подписать сборку» вариант в разделе страницы «подписывания», а затем указать ключа строгого имени файла. SourcedAggregationRoot код и подпись устанавливается следующим ExposedSetter.Library
    номера Скрыть строки скопировать код ? код
    1. Класс общественного SourcedAggregationRoot : IVersionControllable
      
    2. {
      
    3.     частный длинный вариант;
      
    4.     частный длинный филиал;
      
    5.     #region IVersionControllable Пользователи
      
    6.     общественности долго версия
      
    7.     {
      
    8.         получить { вернуть эту .version; }
      
    9.         внутреннее множество { это .version = значение ; }
      
    10.     }
      
    11.     общественности давно Branch
      
    12.     {
      
    13.         получить { вернуть эту .branch; }
      
    14.         внутреннее множество { это .branch = значение ; }
      
    15.     }
      
    16.     #endregion
      
    17. 
      
    18.     общественного переопределение строки ToString ()
      
    19.     {
      
    20.         возвращенная строка .Format ( "Version = {0}, Отделение = {1}" ,
      
    21.             версия, филиал);
      
    22.     }
      
    23. }
      

     образ

  2. Создать новую библиотеку классов, чтобы вызвать внутреннюю сеттер ExposedSetter.Library собственности в SourcedAggregationRoot из. Для удобства описания мы этот класс библиотека имени ExposedSetter.Library2. В этой библиотеке классов, чтобы добавить ссылку на ExposedSetter.Library, а просто написать тест класса, вызовите внутренний сеттер SourcedAggregationRoot свойства непосредственно в классе, чтобы установить значение свойства.
    номера Скрыть строки скопировать код ? код
    1. общественный класс Class1
      
    2. {
      
    3.     общественного SourcedAggregationRoot Test ()
      
    4.     {
      
    5.         SourcedAggregationRoot сар = новый SourcedAggregationRoot ();
      
    6.         sar.Branch = 125 ;
      
    7.         вернуться сар;
      
    8.     }
      
    9. }
      

    Аналогично, для ExposedSetter.Library2 делать цифровые подписи (это важно!)

  3. Запустите командную строку из Visual Studio, используйте Sn.exe получить открытый ключ ExposedSetter.Library2 из (открытого ключа) Примечание: Это открытый ключ, а не ключевой знак общественного
    образ
  4. Откройте ExposedSetter.Library файл AssemblyInfo.cs, чтобы добавить InternalsVisibleToAttribute:
    номера Скрыть строки скопировать код ? код
    1. [ Сборка : InternalsVisibleTo ( "ExposedSetter.Library2, ОткрытыйКлюч = 0024000004800000940000000602000000240" +
      
    2.     "000525341310004000001000100bbccb249a2e7a1" +
      
    3. "7cbddf86e24532777568cb13c2ea7643b61cf60367068f2b9ca785dca303c49f015823e4eaa17b" +
      
    4. "50ed60ac47563dc8d8771358f10c3dc41f288530cfa350e6a2a24781dedeb8ec4138f93e76c537" +
      
    5. "bce6c5aa7b25858fa90d6ef5c6ea613b1b49e6e287f9ebb7f990cfa0ce17fbfe1c338e95e88c14" +
      
    6. "81f9598f" )]
      

    Обратите внимание, что параметр InternalsVisibleToAttribute указывает разрешить доступ к его внутреннему имени сборки член и открытых ключей данных. В этой версии нельзя установить сборку и другую информацию, или компилятор будет идти до конца.

  5. Обобщение решения

Таким образом, немного похож на друг C ++. По сравнению с решениями объекта адаптера я уже упоминал выше, этот подход более профессионально, в конце концов, может быть непосредственно поддерживается .NET Framework, но и является более безопасным, он может явно указать, какой узел может получить доступ к остальной части Вы не можете получить доступ. Но этот подход также имеет свои недостатки: Предположим, у меня есть будущее сборки ExposedSetter.Library хотите использовать внутренний элемент, мне нужно изменить код ExposedSetter.Library для того, чтобы добавить InteralsVisibleToAttribute характеристики.

 

Адрес репринт: http://www.cnblogs.com/daxnet/archive/2010/08/12/1797782.html

Воспроизводится в: https: //www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.html

рекомендация

отblog.csdn.net/weixin_30583563/article/details/94798292