【问题标题】:C# - Load Type from Custom AssemblyC# - 从自定义程序集中加载类型
【发布时间】:2018-04-22 04:57:30
【问题描述】:

我正在编写一个 C# 应用程序,它可能会引用我也在编写的类库。该类库旨在成为我可能想要使用的其他类库的模板。我的意图是动态加载和使用类库生成的程序集中的类型。我想根据可配置的设置加载类型。这时候我的设置是这样的:

“MyOrg.MyApp.Services.Example, MyOrg.MyApp.Services”

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

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

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

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

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

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

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

【问题讨论】:

  • 添加类库作为对 .您可以使用与 System.dll 或 [您的显示技术].dll 等引用完全相同的方式使用这些类
  • 无法加载类型,只能加载包含要实例化的类型的整个程序集

标签: c# reflection


【解决方案1】:

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

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);

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

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多