2010-04-30 15 views
12

[InternalsVisibleTo()] özelliğini kullanarak bir 'arkadaş montajı' oluşturmaya çalışıyorum, ancak çalışmayı başaramıyorum. Microsoft'un creating signed friend assemblies yönergelerini takip ettim ve yanlış gittiğimi göremiyorum. Bu yüzden adımı burada detaylandıracağım ve umarım birileri benim kasıtlı hatayı fark edebilir ...?Arkadaş Meclileri C#

böylece ortak anahtarı Güçlü bir isim anahtarı oluşturun ve ayıklamak:

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

Ekle Her projeye güçlü isim anahtarı ve imzalamayı etkinleştirin.

bir iç özelliği ile Internals adlı bir proje ve bir sınıf oluşturun:

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

TestInternalsVisibleTo adlı başka bir proje oluşturun: Içselleri projesi için

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); 
     } 
    } 
} 

Düzenleme AssemblyInfo.cs dosyası, gerekli özniteliği ekleyin:

[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")] 

Ve sonunda ... inşa! nedeniyle koruma düzeyi
hata CS1729 için erişilemez 'Internals.ClassWithInternals':

hata CS0122:

Ben aşağıdaki hataları olsun 'Internals.ClassWithInternals' 1 argüman alan bir yapıcı içermiyor error CS1061: 'International'ı.ClassWithInternals' bir 'Message' tanımı içermiyor ve 'Interals.ClassWithInternals' türünde bir ilk argümanı kabul eden 'Message' bulunamıyordu. ?)

Temel olarak, InternalsVisibleTo attrbute kullanılmamış gibi. Şimdi, araçları suçlama tuzağına düşmeyeceğim, yani burada ne var? Kimse?

+1

Emin misiniz TestInternalsVisibleTo imzalanıyor? Reflector'da görüntülediğinizde, genel anahtar belirteci olduğunu görüyor musunuz? –

cevap

15

InternalsVisibleTo özniteliğinizde derleme adından sonra bir virgül eksik.

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

Montaj referanslar titiz olabilir ve ne yazık ki derleyici onlar dizeleri gibi özellik iç göründüğünde onları doğrulamak denemez:

Öyle olmalı. Montaj referansını yanlış yazıyorsanız veya geçersiz bir anahtar sağlıyorsanız - her şey derlenecek - ancak işe yaramayacaktır.

+0

Çivilenmişsin, teşekkürler! Bu ipi kaç kez kontrol ettiğimi anlatamam! :) Basit bir şey olacağını biliyordum. –

İlgili konular