給定System.Reflection.Assembly
的實例。如何獲得程序集的根名稱空間?
回答
不可能。沒有指定「根」名稱空間。在選項中的默認命名空間是一個Visual Studio的東西,而不是一個.NET的事情
有可能是任何數量的命名空間在給定的裝配,並沒有什麼要求他們都來自一個共同的根源開始。你可以做的最好的做法是反映程序集中的所有類型,並建立其中包含的唯一名稱空間列表。
程序集不一定有根名稱空間。命名空間和組件是正交的。
您可能正在尋找的是在該Assembly中找到一個類型,然後找出它的名稱空間是什麼。
您應該能夠通過使用GetExportedTypes()成員,然後使用從返回式手柄中的一個命名空間屬性來實現這一點。
雖然如此,但不能保證所有類型都在同一個命名空間中(或甚至在相同的命名空間層次結構中)。
命名空間具有無關組件 - 一個命名空間和在一個組件中的類之間的任何映射是純粹由於命名約定(或重合)。
儘管我同意,但值得注意的是,Visual Studio項目具有默認名稱空間,並且如果使用Visual Studio嵌入資源,那麼該資源的清單資源名稱是從默認名稱空間派生的,並且似乎由程序集本身定義你總是使用Visual Studio來構建程序集。讓我們面對現實吧,這很常見。 – Lisa 2011-06-07 02:59:31
當我想通過其清單資源流從當前程序集加載資源時,遇到了這種困境。
的事實是,如果你使用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)
此代碼實際工作。謝謝! – Roboblob 2011-12-27 23:07:54
當程序集名稱與我的項目的「根名稱空間」不匹配時,遇到嵌入式資源解析問題。感謝您的幫助 – 2013-11-17 19:45:09
GetType(frm).Namespace
frm
是ST artup表格
實際上有一個間接的方法來獲取它,通過枚舉程序集的清單資源的名稱。你想要的名字以你知道的那部分結束。
而不是重複這裏的代碼,請參閱get Default namespace name for Assembly.GetManifestResourceStream() method
我剛剛創建一個空的內部類稱爲根,並把它在項目的根(假設這是你的根命名空間)。然後,我用這個到處都是我需要的根命名空間:
typeof(Root).Namespace;
當然,我結束了一個未使用的文件,但它是乾淨的。
我在我的WPF應用程序中使用typeof(App).Namespace
。 應用程序類對於任何WPF應用程序都是必需的,它位於根目錄中。
我在這裏找到的問題是,「如果我深入調用庫代碼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),這將返回錯誤的答案。我的目標是拿一些啓動代碼,並讓它很容易地找到一個類或控制器或根名稱空間中的任何內容,即使執行該工作的代碼位於庫中。這完成了該任務。
我相信這是可以改進的 - 我敢肯定,這種做事的方式可以在很多方面得到改善,並且改進是值得歡迎的。
在這裏添加所有其他答案,希望沒有重複的信息,這裏是我如何使用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
)
)
這裏作爲一個相當簡單的方式來獲得網站幻燈根命名空間嵌入互操作類型克拉。
''' <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項目時,這對於日誌記錄非常有用。希望這可以幫助某人。
- 1. 根名稱空間和程序集名稱之間的區別
- 2. 獲取已加載程序集的根名稱空間(程序集名稱空間)
- 3. WPF外部程序集名稱空間
- 4. 如何查找.NET名稱空間的程序集名稱,例如Microsoft.WindowsAzure.ServiceRuntime
- 5. 如何引用特定程序集中的名稱空間?
- 6. 如何返回System.Collections程序集中的名稱空間列表?
- 7. 獲取調用方法的名稱空間和程序集
- 8. 如何獲得名稱空間和類名的方法名?
- 9. 如何獲得完全合格的程序集名稱
- 10. 動態更改名稱空間和程序集名稱
- 11. 程序集有多個名稱空間或由單個名稱空間組成
- 12. 獲取程序集名稱
- 13. 命名空間字符串中的程序集名稱
- 14. ILMerge:重命名內部化程序集的名稱空間?
- 15. 如何獲得表單集ID /名稱
- 16. C#如何使用短名稱打開程序集(或只有短名稱時如何獲得強名稱)
- 17. 如何獲得名稱空間屬性的值
- 18. 如何獲得名稱空間的引用Microsoft.WebPages.Compilation
- 19. 如何在我的房產名稱中獲得空間?
- 20. 如何獲得CPU密集程度最高的應用程序的名稱?
- 21. 命名空間和程序集名稱如何爲IronPython類型工作?
- 22. struts2如何獲取名稱空間值?
- 23. 什麼是調用程序集名稱的完全限定名稱空間?
- 24. 如何將用戶空間進程切換回根網絡名稱空間?
- 25. 什麼是RawRabbit的專有名稱空間和程序集?
- 26. 使用HttpUtility.UrlEncode()使程序集的名稱空間「消失」?
- 27. 使用msxsl中的程序集和名稱空間問題
- 28. 如何獲得命名空間
- 29. 如何獲得已安裝應用程序的進程名稱
- 30. 命名空間'System'中不存在類型或名稱空間名稱'Linq'(缺少程序集引用嗎?)
來自用戶Lisa的下面帖子實際上是這樣的,所以這個答案被標記爲答案,但沒有正確的理由。 – Roboblob 2011-12-27 23:07:27
@Roboblob達倫的答案在技術上是正確的。在VS中建立一個項目的背景下,你想知道這一點的情況下,95%左右的情況下礦井只是有用的。 – Lisa 2012-05-16 04:54:38