2014-08-29 25 views
27

Visual Studio'ya uzantı yapıyorum. Kod içinde, onaylar ve kontroller yapmak için Kod Sözleşmeleri kullanıyorum. Uyarı seçeneği seviyesini yüksek olarak ayarlıyorum.Kod Sözleşmelerinin, belirli bir montaj referansını nasıl görmezden gelmesini sağlayabilirim?

Yapmak istediğim şey, EnvDTE referanslarında yapılan tüm kontrolleri dikkate almadan uyarı seviyesini korumaktır.

Aşağıdaki kod örneği düşünün: İsterdim neyi nedenle

Contract.Assume(project.ConfigurationManager != null); 
Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); 
Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null); 

: benim şimdiki ayarları ile

public static string GetAbsoluteOutputFolder(EnvDTE.Project project) 
{ 
    if (project == null) throw new ArgumentNullException("project"); 

    var path = 
     project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString(); 
    //... 
} 

CC path değişken atamadan önce aşağıdaki kontrolleri eklemek için bana gerektirecektir Burada yapmak CC'ye EnvDTE’i “güven” etmeyi ve bu türleri ve özelliklerini görmezden gelerek söylemektir.

Bu amaca hizmet eden "Harici API'da iyimser olun" CC seçeneği olduğunu düşündüm; çıkmıyor.

daha düşük bir uyarı düzeyi gerektirmeyecek şekilde istediğim şekilde davranmasını sağlamanın bir yolu var mı?

DÜZENLEME: Proje düzeyinde çalışacak ve yine de "düzenli" kontrollerin yapılmasına izin verecek bir çözüm istiyorum.

+1

Ben olsaydım, atlamak istediğiniz Çekleri eklerdim.Eğer kodunuz, EnvDTE.Project içindeki bir Null Reference'dan dolayı havaya uçurulursa, bu kontrollere sahip olmak, Null'ın nerede olduğunu tahmin etmek yerine sorunun nerede olduğunu tam olarak bilmenizi sağlayacaktır. –

+0

@MikeBurdick Şey, bu özelliklerin bir kısmının büyük olasılıkla boş kalmamasıdır. Ancak bu meclis sözleşmelerle derlenmediğinden, motorun anlatma yolu yok. Bu nedenle, bunları, sözleşmesiz herhangi bir mülk gibi ele alır ve aynı mülk için tekrar tekrar kontrol edilmesini zorlar. Eğer bir 'Global Configuration', '' Configuration.Properties '' i (örneğin) null olarak döndürürse, bunu kullanabilmem için memnuniyetle kullanırdım. Öyleyse, IMHO'nun daha az kötülük, CC'ye, bu belirli meclise ait herhangi bir kodu görmezden gelmesini söylemek olacaktır. – Crono

cevap

4

detaylı çözüm sağlar veremeyiz ama bu montaj düzeyde Temel Özelliği veya System.Diagnostics.CodeAnalysis.SuppressMessage birini kullanarak çözülebilir olmalıdır:

[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", "Whatever")] 

Sen "Hedef" Mülkiyet kullanabilirsiniz SuppressMessageAttribute sadece belirli türleri/Yöntemler/Ad bulunan İleti görmezden:

[SupressMessage("Microsoft.Contracts", "CC1055", Scope="Member", Target="YouNamespace.EnvDTE.Project"] 

i kullanılan parametreler you'll doğru Kapsam, MessageID anlamaya ve kendinizi Hedef zorunda sadece iyi bir bahis olduğu Not:) Bir sineote üzerinde, ben Öznitelik Koşullu ("CODE_ANALYSIS") olduğunu düşünün.

Bu sorunun resmi olarak önerileceği çözüm, büyük olasılıkla, EnvDTE.Project nesnelerini oluşturacak veya içerecek bir depoda, bir çeşit sarıcı oluşturmaktır. Daha sonra gerekli Contract.Ensures orada ekleyebilirsiniz.

+0

Söz konusu montaj için kodun sahibi yoksa bir montaj seviyesi uyarısı nasıl yerleştirebilirim? – Crono

+1

@Crono: SuppressMessageAttribute öğesinin "Hedef" özelliğini kullanarak harici libs üzerindeki iletileri engelleyebilir, bunu cevap olarak ekleyebilirim. – Mecaveli

0

Montaj düzeyinde [assembly: Contracts.ContractVerification(false)] ile bir şey denediniz mi?

dinamik yapmak mümkün olmalıdır: Bu yardımcı olur https://msdn.microsoft.com/en-us/library/bb458043.aspx

Hope,

+1

Bu özniteliği doğru anlıyorsam, yalnızca bu derlemede sözleşme doğrulamasını engeller. OP'nin istediği, montajı kullanarak yaratılan tüm uyarıları göz ardı etmektir. –

1

Ben sorunu çözmek için mümkün olduğunu düşünüyorum ama C# 6.0 beri en az kolaylaştırır bir çözüm vardır yok ağrı biraz:

yerine

Contract.Assume(project.ConfigurationManager != null); 
Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null); 
Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null); 

arasında artık

yazabilir
Contract.Assume(project.ConfigurationManager?.ActiveConfiguration?.Properties != null);