【问题标题】:Using dynamic in C# without referencing a DLL在 C# 中使用动态而不引用 DLL
【发布时间】:2014-07-07 10:33:22
【问题描述】:

我想在 C# 中使用动态与外部 API (DLL) 中定义的对象进行交互。这样,我不想在我的控制台应用程序中引用 API。这可行吗?

例如,我使用了一些东西:

dynamic obj1 = new ObjectDefinedInAPI();

编译器一直在唠叨这个

The type or namespace name 'objectDefinedInAPI' could not be found ...

有什么想法吗?

谢谢

【问题讨论】:

  • 动态加载程序集。关键字dynamic 只是声明成员绑定是延迟的,将在运行时完成。
  • 正如@HamletHakobyan 提供的指导,这里是reference tutorial。与您进行互操作的程序集必须在某个时候加载到内存中。想想Windows API,你必须使用DllImport;将它们加载到内存中。
  • 为此,我相信您将不得不求助于 ServiceLocator 模式和一个包含服务接口的库。此库必须对您的控制台应用程序和包含从该接口继承的类的实际实现的库都是通用的。然后,您可以动态加载 DLL 并让它在您的 ServiceLocator 容器中自动注册。
  • 或者,如果您真的不想加载 dll,您可以使用 new ExpandoObject()(这比创建类型的实例并将其分配给 dynamic 字段更有意义)。
  • @JeroenVannevel ExpandoObject 将如何提供帮助? Op需要使用现有的类。它可能有一些 OP 可能需要使用的良好实现的功能。

标签: c# c#-4.0 dynamic reflection


【解决方案1】:

您可以手动加载程序集,然后在知道程序集名称和类名称的情况下创建类的实例。

var assembly = Assembly.LoadFrom("filepath"); 
var aClass = assembly.GetType("NameSpace.AClass");
dynamic instance = Activator.CreateInstance(aClass);

【讨论】:

    【解决方案2】:

    除了 NeutronCode 答案,您还可以尝试以下方法:

    public interface IDynamicService {
        void DoSomething();
    }
    
    public void static main() {
        var assembly = Assembly.LoadFrom("filepath"); 
        var aClass = assembly.GetType("NameSpace.AClass");
        IDynamicService instance = Activator.CreateInstance(aClass) as IDynamicService;
    
        if (instance != null) {
            instance.DoSomething();
        }
    }
    

    这样您可以确保您的类型具有特定的实现。请注意,实际的类必须继承接口才能使其工作,因此如果您无权访问其他 dll 源代码,这将无济于事。这样做的好处是您可以获得 Intellisense,并且始终确保您的动态类与您的应用程序很好地接口。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多