如何在.Net中获取给定类型的程序集(System.Reflection.Assembly)?

时间:2009-07-17 01:48:32

标签: c# .net reflection .net-assembly

在.Net中,给定一个类型名称,是否有一个方法告诉我在哪个程序集(System.Reflection.Assembly的实例)中定义了该类型?

我认为我的项目已经有了对该程序集的引用,只需要知道它是哪一个。

5 个答案:

答案 0 :(得分:37)

Assembly.GetAssembly假设您有一个类型的实例,Type.GetType假定您拥有包含程序集名称的完全限定类型名称。

如果您只有基本类型名称,则需要执行以下操作:

public static String GetAssemblyNameContainingType(String typeName) 
{
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    {
        Type t = currentassembly.GetType(typeName, false, true);
        if (t != null) {return currentassembly.FullName;}
    }

    return "not found";
}

这也假设您的类型在根中声明。您需要在名称中提供命名空间或封闭类型,或以相同的方式迭代。

答案 1 :(得分:31)

Assembly.GetAssembly(typeof(System.Int32))

System.Int32替换为您需要的任何类型。因为它接受Type参数,所以你可以这样做,例如:

string GetAssemblyLocationOfObject(object o) {
    return Assembly.GetAssembly(o.GetType()).Location;
}

答案 2 :(得分:2)

Type.GetType(typeNameString).Assembly

答案 3 :(得分:2)

我已根据自己的目的调整了接受的答案(返回汇编对象而不是程序集名称),并重构了VB.NET和LINQ的代码:

Public Function GetAssemblyForType(typeName As String) As Assembly
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing)
End Function

我只是在这里分享它,如果其他人想要一个LINQy解决方案来接受答案。

答案 4 :(得分:-1)

如果你可以使用它,这个语法是最短/最干净的:

typeof(int).Assembly