it-swarm-tr.com

Bir derlemenin kök ad alanını nasıl alıyorsunuz?

Bir System.Reflection.Assembly örneği verildi.

36
Andrew

Mümkün değil. Hiçbir şey bir "Kök" ad boşluğu belirtmez. Seçeneklerdeki varsayılan ad alanı bir .net olayı değil görsel bir stüdyo meselesidir.

37
Darren Kopp

Mevcut derlemeden bir kaynağı, açık kaynak akışıyla bir kaynak yüklemek istediğimde, bu ikilemle pek çok kez karşılaştım.

Gerçek şu ki, bir dosyayı Visual Studio kullanarak Meclisinize bir kaynak olarak yerleştirirseniz, manifest kaynak adı, Visual Studio projesinde tanımlandığı şekilde Meclis'in varsayılan ad alanından türetilecektir.

Karşılaştığım en iyi çözüm (varsayılan ad alanını herhangi bir yerde bir dize olarak kodlamaktan kaçınmak için) kaynak yükleme kodunuzun HER ZAMAN varsayılan ad alanında da bulunan bir sınıf içinde ve sonra da aşağıdaki genel yaklaşıma yakın bir yaklaşım olmasını sağlamaktır. Kullanılabilir.

Bu örnek gömülü bir şema yüklüyor.

XmlSchema mySchema;
string resourceName = "MyEmbeddedSchema.xsd";
string resourcesFolderName = "Serialisation";
string manifestResourceName = string.Format("{0}.{1}.{2}",
    this.GetType().Namespace, resourcesFolderName, resourceName);
using (Stream schemaStream = currentAssembly.GetManifestResourceStream(manifestResourceName))
    mySchema = XmlSchema.Read(schemaStream, errorHandler);

Ayrıca bakınız: Bir Derlemenin Ad Alanı nasıl alınır?

Düzenleme: Ayrıca yanıtladığım soruya http://social.msdn.Microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e adresine çok ayrıntılı bir cevap verdim.

Aynı soruna sahip kişilerin bakması durumunda başka bir düzenleme: Kaynak yükleme sorusunu burada çözmek için mükemmel bir fikir: csproj projesinin varsayılan ad alanını nasıl elde edersiniz (VS 2008)

54
Lisa

Belirli bir Meclis'te herhangi bir sayıda isim alanı olabilir ve bunların hiçbiri, hepsinin ortak bir kökten başlamasını gerektirmez. Yapabileceğiniz en iyi şey bir Meclis'teki tüm türler üzerinde düşünmek ve burada yer alan benzersiz ad alanlarının bir listesini oluşturmaktır.

9
Jason Diller

Montajların mutlaka bir kök isim alanına sahip olmaları gerekmez. İsim alanları ve Montajlar dikeydir.

Bunun yerine aradığınız şey, o derleme içinde bir tür bulmak ve sonra da ad alanının ne olduğunu bulmaktır.

Bunu, GetExportedTypes () üyesini kullanarak ve sonra döndürülen Type tutamaçlarından birinden Namespace özelliğini kullanarak başarabilirsiniz.

Yine de, tüm türlerin aynı isim alanında (hatta aynı isim alanı hiyerarşisinde) olduğunu garanti etmiyoruz.

5
therealhoff

Az önce Root adında boş bir iç sınıf yarattım ve bunu proje kök dizinine koydum (bunun sizin kök ad alanınız olduğunu farz ediyorum). Sonra bunu her yerde kullanırım, kök ad alanına ihtiyacım var:

typeof(Root).Namespace;

Tabii ki kullanılmamış bir dosya ile bitirdim, ama temiz.

4
Andy
GetType(frm).Namespace

frm başlangıç ​​şeklidir

2
Tarek Haydar

Türleri Al size Montajda tanımlanan Tür nesnelerinin bir listesini verir. Bu nesnenin bir ad alanı özelliği var. Bir derlemenin birden çok ad alanına sahip olabileceğini unutmayın.

1
Charles Graham

Beni buraya getiren soru, “Kütüphane kodu N yöntemlerini derler ve derinlemesine derler ve Projenin ad alanını isterim - örneğin gerçekten çalışan MVC uygulaması - bunu nasıl anlarım?” İdi.

Biraz hack ama bir yığın yakalayıp filtre uygulayabilirsiniz:

    public static string GetRootNamespace()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();
        string ns = null;
        foreach(var frame in stackFrames)
        {
            string _ns = frame.GetMethod().DeclaringType.Namespace;
            int indexPeriod = _ns.IndexOf('.');
            string rootNs = _ns;
            if (indexPeriod > 0)
                rootNs = _ns.Substring(0, indexPeriod);

            if (rootNs == "System")
                break;
            ns = _ns;
        }

        return ns;
    }

Bütün bunlar tek yapmayı sağlamak, en son çağrılandan kök dizinine kadar yöntemlerin çalıştırılması ve Sistem filtrelemesi. Bir Sistem çağrısı bulduğunda çok fazla gittiğini bilir ve hemen üstündeki ad alanını döndürür. Bir Birim Testi, MVC Uygulaması veya Hizmet çalıştırıyor olsanız da, Sistem kabı, Projenizin kök ad alanından 1 kat daha derinlemesine oturacak, bu yüzden işte.

Sistem kodunun bir aracı olduğu bazı senaryolarda (System.Task gibi) izleme boyunca bu yanlış cevabı döndürecektir. Amacım örneğin bazı başlangıç ​​kodları almaktı ve işi yapan kod bir kütüphanede yer alsa bile kolayca bir sınıf veya Denetleyici veya kök Ad Alanında bulunan her şeyi kolayca bulmasını sağlamaktı. Bu, bu görevi gerçekleştirir.

Bunun iyileştirilebileceğinden eminim - işleri yapmanın bu zorlu yolunun birçok yönden iyileştirilebileceğinden eminim ve gelişmeler memnuniyetle karşılanır.

0
Chris Moschini

İsim alanlarının meclislerle hiçbir ilgisi yoktur - bir isim alanı ile bir Meclis'teki sınıflar arasındaki herhangi bir haritalama tamamen bir adlandırma kuralından (veya tesadüften) kaynaklanmaktadır.

0
Michael Burr

Meclis’in tezahür ettiği kaynakların isimlerini sıralayarak elde etmenin dolaylı bir yolu var. İstediğiniz ad, bildiğiniz kısımlarla bitiyor.

Buradaki kodu tekrarlamak yerine, bakınız get Assembly.GetManifestResourceStream () yöntemi

0
David A. Gray

Bir web sitesi projesi için kök isim alanını elde etmenin oldukça basit bir yolu.

''' <summary>
''' Returns the namespace of the currently running website
''' </summary>
Public Function GetWebsiteRootNamespace() As String
    For Each Asm In AppDomain.CurrentDomain.GetAssemblies()
        If Asm Is Nothing OrElse Asm.IsDynamic Then Continue For

        For Each Typ In Asm.GetTypes
            If Typ Is Nothing OrElse Typ.Name Is Nothing Then Continue For
            If Typ.Name = "MyProject" Then Return Typ.Namespace.Split("."c)(0)
        Next
    Next

    Return Nothing
End Function

Bu sadece "MyProject" tipi için yüklenen tüm montajları kontrol eder ve bu tip için kök isim alanını döndürür. Bu, bir günlük sistemini paylaşan tek bir çözümde birden fazla web projeniz olduğunda günlüğe kaydetme için kullanışlıdır. Umarım bu birine yardımcı olur.

0
Howard

WPF uygulamamda typeof(App).Namespace işlevini kullanıyorum. Uygulama sınıfı herhangi bir WPF uygulaması için zorunludur ve root'ta bulunur.

0
Mr.B

Buradaki diğer tüm cevapları ekleyerek, umarım bilgi tekrar etmeden, işte bunu Linq kullanarak nasıl çözdüğüm. Durumum Lisa'nın cevabına benzer.

Benim çözümüm aşağıdaki uyarılarla geliyor:

  • Visual Studio'yu kullanıyorsunuz ve "kök ad alanı" terimini kullandığınızdan beri istediğinizi düşündüğünüz projeniz için tanımlanmış bir Kök Ad alanı var.
  • Birlikte çalışma türlerini başvurulan derlemelerden gömemezsiniz
Dim baseNamespace = String.Join("."c,
    Me.GetType().Assembly.ManifestModule.GetTypes().
        Select(Function(type As Type)
                    Return type.Namespace.Split("."c)
                End Function
        ).
        Aggregate(Function(seed As String(), splitNamespace As String())
                        Return seed.Intersect(splitNamespace).ToArray()
                    End Function
        )
)
0
jhyry-gcpud