我正在编写一个可能引用我正在编写的类库的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
类型的方法。
是否有一种我忽视的实用方法可以让我这样做?如果没有,我如何从自定义程序集加载特定类型?谢谢!
答案 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);
请记住,您将无法以类型安全的方式访问此实例上的成员,除非您在实例化后将其粘贴到接口并将其强制转换为该接口,但这是一个不同的主题。