2008-09-18 38 views

回答

34

不可能。沒有指定「根」名稱空間。在選項中的默認命名空間是一個Visual Studio的東西,而不是一個.NET的事情

+2

來自用戶Lisa的下面帖子實際上是這樣的,所以這個答案被標記爲答案,但沒有正確的理由。 – Roboblob 2011-12-27 23:07:27

+6

@Roboblob達倫的答案在技術上是正確的。在VS中建立一個項目的背景下,你想知道這一點的情況下,95%左右的情況下礦井只是有用的。 – Lisa 2012-05-16 04:54:38

9

有可能是任何數量的命名空間在給定的裝配,並沒有什麼要求他們都來自一個共同的根源開始。你可以做的最好的做法是反映程序集中的所有類型,並建立其中包含的唯一名稱空間列表。

4

程序集不一定有根名稱空間。命名空間和組件是正交的。

您可能正在尋找的是在該Assembly中找到一個類型,然後找出它的名稱空間是什麼。

您應該能夠通過使用GetExportedTypes()成員,然後使用從返回式手柄中的一個命名空間屬性來實現這一點。

雖然如此,但不能保證所有類型都在同一個命名空間中(或甚至在相同的命名空間層次結構中)。

1

Get Types爲您提供了在程序集中定義的Type對象列表。該對象具有名稱空間屬性。請記住,程序集可以有多個名稱空間。

0

命名空間具有無關組件 - 一個命名空間和在一個組件中的類之間的任何映射是純粹由於命名約定(或重合)。

+3

儘管我同意,但值得注意的是,Visual Studio項目具有默認名稱空間,並且如果使用Visual Studio嵌入資源,那麼該資源的清單資源名稱是從默認名稱空間派生的,並且似乎由程序集本身定義你總是使用Visual Studio來構建程序集。讓我們面對現實吧,這很常見。 – Lisa 2011-06-07 02:59:31

47

當我想通過其清單資源流從當前程序集加載資源時,遇到了這種困境。

的事實是,如果你使用Visual Studio嵌入文件作爲資源在組件中的清單資源名稱會從組件的默認命名空間被推斷爲在Visual Studio項目中定義。

我想出了最好的解決方案(避免將默認名稱空間硬編碼爲字符串),只是簡單地確保您的資源加載代碼總是從類內部發生,該類也在默認名稱空間中,然後是以下內容可以使用接近通用的方法。

本示例加載嵌入式架構。

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

參見:How to get Namespace of an Assembly?

編輯:還注意到一個非常詳細的答案,我在http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e

回答問題的情況下,與人同樣的問題,另一個編輯來找:優秀的主意解決資源裝載問題在這裏:How get the default namespace of project csproj (VS 2008)

+1

此代碼實際工作。謝謝! – Roboblob 2011-12-27 23:07:54

+2

當程序集名稱與我的項目的「根名稱空間」不匹配時,遇到嵌入式資源解析問題。感謝您的幫助 – 2013-11-17 19:45:09

2
GetType(frm).Namespace 

frm是ST artup表格

3

我剛剛創建一個空的內部類稱爲根,並把它在項目的根(假設這是你的根命名空間)。然後,我用這個到處都是我需要的根命名空間:

typeof(Root).Namespace; 

當然,我結束了一個未使用的文件,但它是乾淨的。

0

我在我的WPF應用程序中使用typeof(App).Namespace。 應用程序類對於任何WPF應用程序都是必需的,它位於根目錄中。

0

我在這裏找到的問題是,「如果我深入調用庫代碼N方法並且需要項目的命名空間 - 例如實際運行的MVC應用程序 - 我該如何得到它?」

有點哈克但你可以抓住一個堆棧跟蹤和過濾:系統

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

這一切正在做的是獲得堆棧跟蹤,跑下來,從最近的方法調用根,和過濾。一旦它發現一個系統調用它知道它太過分了,並且返回它上面的命名空間。無論您是運行單元測試,MVC應用程序還是服務,系統容器將比您的項目的根名稱空間更深1級,所以瞧。

在某些情況下,系統代碼是沿着跟蹤的中介(如System.Task),這將返回錯誤的答案。我的目標是拿一些啓動代碼,並讓它很容易地找到一個類或控制器或根名稱空間中的任何內容,即使執行該工作的代碼位於庫中。這完成了該任務。

我相信這是可以改進的 - 我敢肯定,這種做事的方式可以在很多方面得到改善,並且改進是值得歡迎的。

0

在這裏添加所有其他答案,希望沒有重複的信息,這裏是我如何使用Linq解決這個問題。我的情況與Lisa的回答類似。

我的解決方案具有以下注意事項:

  • 你使用Visual Studio,併爲您的項目,我假設定義的根命名空間是你問什麼,因爲你使用術語「根命名空間」
  • 你不是從引用的程序
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

這裏作爲一個相當簡單的方式來獲得網站幻燈根命名空間嵌入互操作類型克拉。

''' <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 

這簡單地檢查所有加載的程序集的「MyProject的」類型,並返回針對該類型的根名稱空間。在共享日誌系統的單一解決方案中有多個Web項目時,這對於日誌記錄非常有用。希望這可以幫助某人。

相關問題