【问题标题】:C# Assembly Loading and Late BindingC# 程序集加载和后期绑定
【发布时间】:2010-11-08 02:03:22
【问题描述】:

我正在阅读 this 关于 C# 和 .NET 的书,并且正在学习很多很酷的东西。我已经阅读了作者谈论动态加载程序集并在该程序集中创建类型实例的部分。

在 AS3 中,可以做同样的事情,除了一件事:您可以要求编译器不要编译一组类,而是检查类型安全。这是一个例子:

//Defined in an external library
public class A {...}


//In my application, I tell the compiler to type check A, but not compile it
var a:A = new A();
a.whatever();

在我的应用程序代码运行时,我可以动态加载包含类 A 定义的外部库,将这些定义加载到我的应用程序的 ApplicationDomain 中,一切都会正常运行。无需反思!

这在 C# 中可行吗?

换句话说,我可以指示 C# 编译器对一堆类(比方说,在库中)进行类型检查,但将它们排除在编译之外吗?

【问题讨论】:

    标签: c# actionscript-3 assemblies late-binding applicationdomain


    【解决方案1】:

    我不是 100% 清楚 as3 代码在做什么 - 但听起来您想定义一个外部程序集可以实现的通用接口(在单独的 dll 中) - 并在创建时简单地转换它对象:

    Type type = loadedAssembly.GetType(fullyQualifiedName);
    IMyInterface obj = (IMyInterface)Activator.CreateInstance(type):
    

    现在您可以轻松使用在obj 上定义的方法了。

    另外,在 C# 4.0 中,dynamic 关键字提供了鸭子类型。

    【讨论】:

    • 注意:动态关键字比普通界面灵活一点,如果在普通界面上更改版本,要么需要重新编译扩展程序和主应用程序,要么需要处理重定向解析器。
    • 这是你做插件界面的方式吗?
    • 这确实是插件 API 最常见的选项之一。
    • @Subb,请参阅 MEF,了解 Microsoft 推荐的最终插件方式
    • @Sam - 目前只是一个预览版。它可能在未来成为最终的[等]。
    【解决方案2】:

    我只是read this

    Action Script 是一种动态语言,它作为“特殊奖励”提供类型检查功能,它可以帮助您在编译时捕获错误,就像静态类型语言一样。

    C# 是一种静态类型语言,它在编译时进行所有类型检查。类型检查不是“额外的好处”,它是一个不可或缺的功能。 C# 一直具有使用反射进行后期绑定的能力,并且随着即将推出的新动态关键字,该功能变得更好。

    但是,如果您使用 C# 具有的任何后期绑定功能,则不会进行类型检查。

    【讨论】:

    • 好吧。那很有意思。在我看来,AS3 是一种具有一些动态特性的静态类型语言。我不知道我为什么这么想,因为它基于 ECMAScript,一种动态语言。我猜编译器在隐藏它方面做得很好。这实际上解释了很多事情......
    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2012-04-27
    • 2015-10-06
    相关资源
    最近更新 更多