Bir arkadaş meclisi nasıl ilan edilir?


114

Çözümümde 2 projem var:

  1. Montaj (Temel Kitaplık)
  2. Test Montajı (NUnit)

İlk projede test montajını arkadaşlar meclisi olarak ilan etmiştim:

[assembly: InternalsVisibleTo ("Company.Product.Tests")]

Montajlarımı imzalamak için çözümü kurmayı unuttuğumu fark edene kadar her şey yolunda gidiyordu. Böylece bir snk dosyası oluşturuldu ve ilk montajı (Temel Kitaplık) imzalamak için görsel stüdyo projesini kurduk. Şimdi ilk projeyi derlediğimde şu hatayı alıyorum:

Arkadaş montaj referansı 'Company.Product.Tests' geçersiz. Kesin ad imzalı derlemeler, InternalsVisibleTo bildirimlerinde bir ortak anahtar belirtmelidir.

Genel anahtarı snk dosyamdan sn yardımcı programını kullanarak çıkarmaya çalıştım, ancak nasıl kullanacağımı bilmediğim kablolu bir ikili dosya oluşturdu. Sorunu nasıl çözebilirim?

Yanıtlar:


194

Her iki montajı da imzalamanız gerekir çünkü her iki montaj da etkili bir şekilde birbirine başvurur.

Genel anahtarı InternalsVisibleTo özniteliğine koymanız gerekir. Örneğin, Protokol Tamponlarında kullanıyorum:

[assembly:InternalsVisibleTo("Google.ProtocolBuffers.Test,PublicKey="+
"00240000048000009400000006020000002400005253413100040000010001008179f2dd31a648"+
"2a2359dbe33e53701167a888e7c369a9ae3210b64f93861d8a7d286447e58bc167e3d99483beda"+
"72f738140072bb69990bc4f98a21365de2c105e848974a3d210e938b0a56103c0662901efd6b78"+
"0ee6dbe977923d46a8fda18fb25c65dd73b149a5cd9f3100668b56649932dadd8cf5be52eb1dce"+
"ad5cedbf")]

Genel anahtar çalıştırılarak alınır

sn -Tp path\to\test\assembly.dll

Alternatif olarak, .snk dosyasından alın:

sn -p MyStrongnameKey.snk public.pk
sn -tp public.pk

7
Ve MSDN belgelerinde ( msdn.microsoft.com/en-us/library/… ) , bana neredeyse genel anahtar belirteci gibi görünen gülünç derecede kısa genel anahtardan bahsetmek çok rahatsız edici .
Hemant

3
Genel anahtarı doğrudan bir .snk dosyasından çıkarabilirsiniz: sn -k MyStrongnameKey.snk // sn -p MyStrongnameKey.snk public.pk // sn -tp public.pk //
Tim Long

1
'Da belirtilen' montaj başlığını 'kullanıyordum AssemblyInfo.cs. O zamandan beri kullanılacak doğru ad, projenin Özellikler / Uygulama iletişim kutusundaki 'derleme adı'dır (Visual Studio'nun çözüm gezginindeki projenin adından yine farklıdır).
Albay Panic

7
Bu cevaplar ve yorumlar ne kadar yararlı olsa da, genel anahtarın 'InternalsInvisibleTo' bildirimini içeren derlemeden DEĞİL, testleri içeren derlemedeki anahtar olduğunu anlamak için biraz deneyime ihtiyacım vardı.
Andreas

3
@Andreas: Adını verdiğiniz meclisle birlikte gidiyor - güvenmeyi yapan meclisin içinde güvenilecek meclisin güçlü adını belirliyorsunuz.
Jon Skeet

-3

Sn.exe ile sihir olmadan ilgilendiğiniz derlemeden publicKey'i doğrudan alabilirsiniz.

<!-- language: c# -->
var assemblyName = Assembly.GetExecutingAssembly().GetName();
Console.WriteLine("{0}, PublicKey={1}",
    assemblyName.Name,
string.Join("", assemblyName.GetPublicKey().Select(m => string.Format("{0:x2}", m))));

1
Bu, bu sorunun cevabı değil . Cevap verdiği cevap
Cole Johnson

-7

"Company.Product.Tests, Version = 1.0.0.0, Culture = nötr, PublicKeyToken = 17135d9fcba0119f" gibi güçlü bir ad girmeniz gerektiğini düşünüyorum. Company.Product.Tests'in derleme adınız ve 17135d9fcba0119f genel anahtar olduğunu varsayıyorum.

Bu sorunu çözmenin başka bir yolu, ayrı derlemeler kullanmak değildir. Genellikle kaynak kodunu ve test kodunu aynı derlemeye koyarım. Onları ayırmanız gerektiğine dair özel bir endişeniz var mı bilmiyorum.


Sürüm numarasını ve kültürü belirtmemiz gerektiğini sanmıyorum (bkz. Msdn.microsoft.com/en-us/library/… ). Test kodunu montajın kendisine koymayı gerçekten denemedim. Nasıl çalıştığını deneyecek ve görecek (bahşiş için +1).
Hemant

4
InternalsVisibleTo için PublicKeToken yeterli değildir. Sen tüm ortak anahtar :-( gerek
Sean Reilly
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.