C# - 自定义程序集中的加载类型

时间:2018-04-21 10:47:46

标签: c# reflection

我正在编写一个可能引用我正在编写的类库的C#应用​​程序。类库旨在成为我可能想要使用的其他类库的模板。我的目的是动态加载和使用类库生成的程序集中的类型。我想基于可配置的设置加载类型。目前,我的设置如下:

" MyOrg.MyApp.Services.Example,MyOrg.MyApp.Services"

此字符串的含义是我想在Example命名空间中使用MyOrg.MyApp.Services类,该命名空间来自MyOrg.MyApp.Services.dll。我将此设置格式基于type元素中的section属性,用于app.config文件中的自定义配置部分,如here所示。

我的问题是, I 如何加载此程序集并实际从此字符串中获取Example类的实例?这时,我有:

Assembly assembly = Assembly.Load("MyOrg.MyApp.Services.Example, MyOrg.MyApp.Services");

但是,当我运行它时,我收到以下错误:

无法加载文件或程序集' MyOrg.MyApp.Services.Example \,MyOrg.MyApp.Services'或其中一个依赖项。给定的程序集名称或代码库无效。

我知道问题是因为我的字符串中有一个类型。如果我只使用MyOrg.MyApp.Service",程序集加载正常。但是,我没有看到加载Example类型的方法。

是否有一种我忽视的实用方法可以让我这样做?如果没有,我如何从自定义程序集加载特定类型?谢谢!

1 个答案:

答案 0 :(得分:0)

有很多不同的方法可以做到这一点。一种方法是从应用程序可访问的文件路径加载程序集,使用其全名获取所需类型,然后使用静态激活器类获取它的实例。

Assembly asm = Assembly.LoadFrom("file path to your assembly");

Type typ = asm.GetType("MyOrg.MyApp.Services.Example, MyOrg.MyApp.Services");

object instance =  Activator.CreateInstance(typ);

请记住,您将无法以类型安全的方式访问此实例上的成员,除非您在实例化后将其粘贴到接口并将其强制转换为该接口,但这是一个不同的主题。