按类名获取程序集

有没有办法让包含名为TestClass的类的程序集? 我只知道类名,所以我无法创建它的实例。 和

 Type objectType = assembly.GetType("TestClass"); 

对我不起作用。

从问题中的Type objectType ,我假设您实际上是按名称输入类型(而不是程序集); 所以假设加载程序集并且类型名称是唯一的,LINQ可能会有所帮助:

 Type objectType = (from asm in AppDomain.CurrentDomain.GetAssemblies() from type in asm.GetTypes() where type.IsClass && type.Name == "TestClass" select type).Single(); object obj = Activator.CreateInstance(objectType); 

但是,使用程序集限定名称而不是类型名称可能更好。

 Assembly asm = typeof(TestClass).Assembly; 

只要引用它就会给你assembly。 否则,您必须使用完全限定名称:

 Assembly asm = null; Type type = Type.GetType("TestNamespace.TestClass, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); if (type != null) { asm = type.Assembly; } 

实际上,在大多数情况下,知道classname就足够了。 MSDN说 – 如果类型在当前正在执行的程序集或Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。

 Type neededType = Type.GetType("TestClass"); //or typeof(TestClass) Assembly a = neededType.Assembly; 

如果您不知道包含类型的程序集(虽然我无法想象为什么) –

 Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Asssembly result = assemblies.FirstOrDefault(a=>a.GetType("TestClass",false)!=null); 

唯一的限制 – 包含TestClass的程序集应该在调用此类代码时已经加载。

希望这会有所帮助。 🙂

Marc的答案非常好,但由于它太慢(我经常使用这种方法),我决定采用不同的方法:

  private static Dictionary types; private static readonly object GeneralLock = new object(); public static Type FindType(string typeName) { if (types == null) { lock (GeneralLock) { if (types == null) { types = new Dictionary(); var appAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var appAssembly in appAssemblies) { foreach (var type in appAssembly.GetTypes()) if (!types.ContainsKey(type.Name)) types.Add(type.Name, type); } } } } return types[typeName]; } 

你可以按照你想要的方式处理名称冲突,但在这个例子中我决定忽略后续的冲突。