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

Posted

技术标签:

【中文标题】如何获取程序集的命名空间?【英文标题】:How to get Namespace of an Assembly? 【发布时间】:2010-10-13 18:42:41 【问题描述】:

假设我有一个程序集(类库 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 我需要程序集的命名空间。

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

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

Type.Namespace;

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

提前致谢

【问题讨论】:

【参考方案1】:

使用 Assembly.GetTypes() - 这将为您获取所有类型的集合,然后您可以获得每个类型的 Namespace 属性。

那么我猜你可以简单地检查所有类型是否具有相同的命名空间值并使用这个值。否则添加一些其他逻辑来检测哪些命名空间被认为是主要的。

【讨论】:

【参考方案2】:

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

不知道有没有更好的办法,不过你可以试试这样找具体的类型(add - using linq;):

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

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

对于该类的命名空间列表,您可以:

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

【讨论】:

此外,即使在同一个命名空间中,程序集也可以包含多种类型。 OP 需要理解这个概念。 谢谢,这个答案更好。【参考方案3】:

更新:

IF assembly nameassembly namespace 在您的项目中相同,并且您确定保留主题AND 你想获得当前执行的程序集的命名空间 然后你可以使用这个:

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

对于您加载的程序集:

var namespace = myAssembly.GetName().Name;

但是 IF 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();

【讨论】:

程序集名称与程序集的命名空间或该程序集中任何特定类型的命名空间不同。所以不幸的是,这个答案是不正确的。 @ErikE,谢谢你的提示。我知道这个问题已经得到回答,我的回答是这种情况下的次要方式:默认情况下它们是相等的,在某些情况下开发人员保持它们相同,所以在这种情况下我的回答是正确的。我用一个额外的 IF 更新了我的答案。【参考方案4】:

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

【讨论】:

那不是用户定义的元数据吗?那么它可以是任何东西。 不,这是文件名。它与命名空间没有任何关系。 这是文件名。它与命名空间没有任何关系【参考方案5】:

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

var str = typeof(ATypeInTheAssembly).AssemblyQualifiedName;
return str.Split(',')[1].Trim();

【讨论】:

【参考方案6】:

要仅取命名空间,请遵循以下代码:

  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;

【讨论】:

这个答案显然是错误的。 assembly.GetType() 返回一个System.Reflection.RuntimeAssembly 对象,该类的命名空间显然总是System.Reflection @Bitterblue 第一个代码在某些时候帮助了我,但我不记得应用程序是什么。一旦我找到我使用代码的地方,我就会提供更多详细信息【参考方案7】:

得到一个程序集必须包含几乎一个类(或任何其他类型,例如接口)并且它们必须包含在一个命名空间中,该命名空间必须在程序集命名空间内开始,它们中最短的将是最后一个.

所以,这是我找到的解决方案:

public string GetAssemblyNamespace(Assembly asm)

    string ns = @"";
    foreach (Type tp in asm.Modules.First().GetTypes()) //Iterate all types within the specified assembly.
        if (ns.Length == 0 ? true : tp.Namespace.Length < ns.Length) //Check whether that's the shortest so far.
            ns = tp.Namespace; //If it's, set it to the variable.
    return ns; //Now it is the namespace of the assembly.

我只找到所需程序集中的所有类型,然后搜索名称最短的命名空间中包含的类型。

【讨论】:

以上是关于如何获取程序集的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间与程序集的区别

第二十一章 命名空间和程序集

获取 AppDomain 中所有可用命名空间的列表

C#中的命名空间和程序集

访问修饰符,命名空间

如何获取命名空间中的所有类?