然而,在进行任何这样的操作之前,必须创建要绑定到的对象的实例。 与早期绑定对象不同,您不能简单地使用 new 关键字来创建实例,因为编译器需要与 new 一起使用的类型名称,而对于晚期绑定类型,这显然是不知道的。 解决办法是采用静态方法 activator.createinstance。这个方法将创建对象的实例(假定引用对象的 type 派生的实例)和一个可选的 object 引用数组(用作构造函数参数)。 以下代码使用 createinstance 创建一个对象并返回一个已知接口:
在某些情况下,代码默认为部分受信任,比如分布在 internet 中或嵌入 html 文档内的控件。 然而,您也可以利用 cas,这样用户就可以安全地使用来自第三方的扩展程序集。在所有情况下,clr 将一个程序集视为一个安全单元,这意味着应用程序可以包含多个程序集,授予其中每个程序集的安全权限都可能有所不同。这对插件来说非常适合。
另外,.net framework 提供了许多功能,并且有许多方法,您可以使用这些方法来创建部分受信任的插件。 以下步骤采用最简单也是最安全的方法。首先,为应用程序的插件创建两个子目录。 一个存放完全受信任的插件,另一个存放部分受信任的插件。然后通过编程方式调整本地安全策略,将代码组与部分受信任插件对应的子目录相关联。 最后,授予代码组中的代码 internet 权限,也就是说使它拥有一个权限子集,将即使可能有恶意的代码也视为是安全的。
如果没有必要,就不要将应用程序中的对象类型指定为公共对象。 如果类型为内部类型(默认情况),则可以限制应用程序中的部分受信任代码对其进行访问。然而,很容易在不经意间就将公共类型引入应用程序。 例如,当您将从 form 派生的类型添加到项目中时,visual studio 向导会生成公共类。 这对大多数应用程序来说都是不必要的,所以应该将这些类型中的 public 关键字删除,当您觉得有必要时再添加上去。
it is possible to instantiate and use objects entirely from within a separate appdomain, and the feature of the .net framework that implements this is called remoting.完全在一个独立的 appdomain 中实例化和使用对象是可以做到的,而在 .net framework 中实现它的功能称为远程处理 (remoting)。远程处理用于跨进程和跨网络访问对象,但也可以用来访问不同 appdomain 中的对象(即使它们位于相同的 windows 进程)。我无法在这里完整地讲述远程处理,但您可以在 以前出版的 msdn magazine 中找到详细的介绍,也可以在我的示例 pluginmanager 类型中找到一些简单的远程处理代码。
非托管应用程序中的托管插件
有了这么多强大的可扩展功能可供您使用,但如果您的应用程序采用非托管语言(如 visual basic 6.0 或 c++)编写的旧式应用程序,可能会觉得非常失望。 而现在可以不必失望了。 clr 本身是一个 com 对象,它可以宿主在由可以编写 com 客户端的语言编写的任何 win32 进程中。
实际上,有三种方式可以宿主非托管程序集中的托管代码和与其进行交互。 可以使用 com interop。 clr 允许您采用 c#、visual basic .net 和其他托管语言创建 com 服务器。 您可以在任何非托管应用程序中绑定和使用这些托管对象。 也可以使用带托管扩展的 c++ (mc++),它能够将托管和非托管代码自然地混合在单个进程中。 如果您的应用程序是用 c++ 编写的,您会发现托管 c++ 包含丰富的可扩展性功能。 另外,还可以直接宿主 clr。 clr 本身是一个可以宿主的 com 对象。 .net framework sdk 带有一个名为 mscoree.h 的 c++ 头文件,它包含将运行库作为 com 对象使用所需的定义。
相关文章请参阅: .net framework: building, packaging, deploying, and administering applications and types .net framework: building, packaging, deploying, and administering applications and types—part 2 背景资料请参阅: .net framework security by brian a. lamacchia, sebastian lange, matthew lyons, rudi martin, and kevin t. price (addison-wesley, 2002)
jason clark provides training and consulting for microsoft and wintellect (http://www.wintellect.com) and is a former developer on the windows nt and windows 2000 server team.jason clark 为 microsoft 和 wintellect (http://www.wintellect.com) 提供培训和咨询,他以前是 windows nt 和 windows 2000 server 团队的开发人员。 他与人合著了 programming server-side applications for microsoft windows 2000 (microsoft press, 2000)。 您可以通过 [email protected]与 jason 联系。