如何获取程序集的命名空间?

How to get Namespace of an Assembly?

提问人:SyncMaster 提问时间:3/17/2009 最后编辑:starblueSyncMaster 更新时间:11/17/2023 访问量:81181

问:

假设我有一个程序集(类库 dll),我使用以下代码加载了它,

Assembly a = Assembly.LoadFrom(@"C:\Documents and Settings\E454935\My Documents\Visual Studio 2005\Projects\nunit_dll_hutt\for_hutt_proj\bin\Debug\asdf.dll");   

我需要获取程序集的类型。为了获得类型,我需要程序集的命名空间。

Type t = asm.GetType("NAMESPACE.CLASSNAME",false,true);             

我怎样才能在上面的一行中获取命名空间。?!为了获取命名空间,我需要获取类型..?

Type.Namespace;

即我需要获取程序集的命名空间,该命名空间可用于获取其类型。

提前致谢

C# .NET 程序集 命名空间

评论


答:

38赞 sharptooth 3/17/2009 #1

Assembly.GetTypes();

这将为你提供所有类型的集合,然后你可以获取每个类型的 Namespace 属性。

然后我想你可以简单地检查所有类型是否具有相同的命名空间值并使用这个值。否则,请添加一些其他逻辑来检测要考虑的命名空间。

25赞 eglasius 3/17/2009 #2

一个程序集可以包含多个命名空间。我认为您真正想问的是如何在不指定命名空间的情况下从程序集中获取类型。

我不知道是否有更好的方法,但您可以尝试寻找这样的特定类型(添加 - 使用 linq;

myassembly.GetTypes().SingleOrDefault(t => t.Name == "ClassName")

如果在不同的命名空间下有 1 个以上具有该名称的类,这将有效地引发(因为 Single 方法确保只有 1 个)。

有关该类的命名空间列表,您可以:

Assembly.Load("ClassName").GetTypes().Select(t => t.Namespace).Distinct();

评论

0赞 Cerebrus 3/17/2009
此外,程序集可以包含多个类型,即使在同一个命名空间中也是如此。OP需要理解这个概念。
0赞 Najeeb 11/19/2018
谢谢,这个答案更好。
0赞 Lance H 10/30/2014 #3

Assembly.GetName().Name将为您提供默认命名空间

评论

0赞 Ray 11/23/2014
这不是用户定义的元数据吗?它可以是任何东西。
6赞 Mark A. Donohoe 4/17/2015
否,这是文件的名称。它不必与命名空间有任何关系。
2赞 Gianpiero 4/29/2018
这是文件的名称。它不必与命名空间有任何关系
23赞 Ramin Bateni 5/6/2015 #4

更新:

如果程序集名称和程序集命名空间在您的项目中是相同的,并且您确定保持主题相同,并且您想要获取当前执行程序集命名空间那么您可以使用以下命令:

var namespace = Assembly.GetExecutingAssembly().GetName().Name;

对于加载的组件:

var namespace = myAssembly.GetName().Name;

但是,如果 & 在您的项目中相同,那么您可以使用这种方式:assembly nameassembly namespace

// Like @eglasius answer >>
// Find all namespaces in the target assembly where a class with the following name is exists:
var namespaceList=Assembly.Load("MyClassName").GetTypes().Select(t => t.Namespace).Distinct();

评论

1赞 ErikE 11/20/2015
程序集名称与程序集的命名空间或该程序集中任何特定类型的命名空间不同。所以不幸的是,这个答案是不正确的。
3赞 Ramin Bateni 11/21/2015
@ErikE,谢谢你的提示。我知道这个问题已经回答了,我的回答是这种情况的次要方式:默认情况下它们是相等的,在某些情况下,开发人员会保持它们相同,所以在这种情况下,我的答案是正确的。我用一个额外的 IF 更新了我的答案。
0赞 Tiago S 4/13/2016 #5

若要仅采用命名空间,请遵循以下代码:

  var assembly = System.Reflection.Assembly.GetAssembly(this.GetType());//Get the assembly object
  var nameSpace = assembly.GetType().Namespace;//Get the namespace

public string GetNamespace(object obj)
{
    var nameSpace = obj.GetType().Namespace;//Get the namespace

    return nameSpace;
}

评论

2赞 Bitterblue 1/12/2017
这个答案显然是错误的。 返回一个对象,并且该类的命名空间显然始终是 。assembly.GetType()System.Reflection.RuntimeAssemblySystem.Reflection
0赞 Tiago S 1/12/2017
@Bitterblue 第一个代码在某个时候帮助了我,但我不记得应用程序是什么。一旦我找到我在哪里使用代码,我就会提供更多细节
1赞 Jean 12/11/2016 #6

使用 Mono/Xamarin,你无权访问“NameSpace”属性。您可以改用以下命令:

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();
1赞 Davide Cannizzo 7/19/2017 #7

假设程序集应包含至少一个类型,并且每个类型都位于程序集命名空间中的命名空间中,则其中最短的命名空间将是程序集命名空间。

public string GetAssemblyNamespace(Assembly asm)
{
    string ns = "";

    foreach (Type tp in asm.Modules.First().GetTypes())
    {
        if (ns.Length == 0 || tp.Namespace.Length < ns.Length)
            ns = tp.Namespace;
    }

    return ns;
}
-1赞 Hichem BEN DAI 11/17/2023 #8
Private Function GetRootNamespace() As String
    Try
        Dim xDeclaringTypeFullName As String = Assembly.GetEntryAssembly.EntryPoint.DeclaringType.FullName
        Dim xRootNamespace As String = xDeclaringTypeFullName.Substring(0, xDeclaringTypeFullName.IndexOf("."))

        Return xRootNamespace
    Catch ex As Exception
        Return String.Empty
    End Try
End Function

评论

1赞 Jeremy Caney 11/17/2023
感谢您有兴趣为 Stack Overflow 社区做出贡献。这个问题已经有相当多的答案,包括一个已经得到社区广泛验证的答案。你确定你的方法以前没有给出过吗?如果是这样,解释你的方法有何不同,在什么情况下你的方法可能更受欢迎,和/或为什么你认为前面的答案不够充分,这将是有用的。你能编辑你的答案以提供解释吗?
1赞 Jeremy Caney 11/17/2023
另外,这个问题是针对 C# 的,但你已经在 VB 中回答了。这并不能回答提出的问题。