2010-04-30 3 views
12

Я пытаюсь создать несколько «сборных узлов», используя атрибут [InternalsVisibleTo()], но я не могу заставить его работать. Я выполнил инструкции Microsoft для creating signed friend assemblies, и я не вижу, где я ошибаюсь. Поэтому я подробно расскажу о своих шагах и надеюсь, кто-то может заметить мою преднамеренную ошибку ...?Собрания друзей в C#

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

зп -k StrongNameKey
зп -p public.pk
зп -ТП 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 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      var c = new Internals.ClassWithInternals("Test"); 
      Console.WriteLine(c.Message); 
     } 
    } 
} 

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

[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: «Internals.ClassWithInternals» недоступен из-за его уровня защиты
ошибка CS1729: «Internals.ClassWithInternals» не содержит конструктор, который принимает аргументы 1 ошибка CS1061: «Internals.ClassWithInternals» не содержит определения для «Message» и не используется метод расширения «Message», принимающий первый аргумент типа «Internals.ClassWithInternals» (вам не хватает директивы using или ссылки на сборку ?)

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

+1

Вы уверены, что TestInternalsVisibleTo подписывается? Когда вы просматриваете его в Reflector, вы видите, что он имеет токен открытого ключа? –

ответ

15

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

Оно должно быть:

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

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

+0

Ты прибил его, спасибо! Я не могу сказать, сколько раз я проверял эту строку! :) Я знал, что это будет что-то простое. –

Смежные вопросы