System.AppDomain.CreateInstanceFrom 方法 (String, String)

方法描述

创建在指定程序集文件中定义的指定类型的新实例。

语法定义(C# System.AppDomain.CreateInstanceFrom 方法 (String, String) 的用法)

public ObjectHandle CreateInstanceFrom(
	string assemblyFile,
	string typeName
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
assemblyFile System-String 文件的名称(包括路径),该文件包含定义所请求类型的程序集。该程序集是使用 LoadFrom 方法加载的。
typeName System-String Type.FullName 属性返回的所请求类型的完全限定名称,包含命名空间而不是程序集。
返回值 System.Runtime.Remoting.ObjectHandle 一个对象,它是新实例的包装,或者如果找不到 typeName,则为 null。 需要打开包装才能访问真实对象。

提示和注释

调用 typeName 的默认构造函数。

有关更多信息,请参见 Activator.CreateInstanceFrom 方法。

如果使用 CreateInstanceFrom 方法在目标应用程序域(不是在其中执行调用操作的应用程序域)中创建实例,程序集将加载到目标应用程序域。 但是,如果该实例是在调用应用程序域中解包的,则以某些方式使用解包的实例会导致程序集加载到调用应用程序域中。 例如,对该实例进行解包后,可能会请求该实例的类型信息,以便调用其后期绑定方法。 将程序集加载到调用应用程序域时,会发生异常。

如果以前曾将同一程序集的另一版本加载到调用应用程序域,或者调用应用程序域的加载路径与目标应用程序域的加载路径不同,则会发生 MissingMethodException 这样的异常。

如果调用应用程序域对实例类型进行早期绑定调用,则尝试强制转换实例时会引发 InvalidCastException。

System.AppDomain.CreateInstanceFrom 方法 (String, String)例子

请参见 DynamicDirectory 属性的示例。

using System;

public interface ITest
{
    void Test(string greeting);
}

public class MarshallableExample : MarshalByRefObject, ITest
{
    static void Main()
    {
        // Construct a path to the current assembly.
        string assemblyPath = Environment.CurrentDirectory + "\\" +
            typeof(MarshallableExample).Assembly.GetName().Name + ".exe";

        AppDomain ad = AppDomain.CreateDomain("MyDomain");

        System.Runtime.Remoting.ObjectHandle oh = 
            ad.CreateInstanceFrom(assemblyPath, "MarshallableExample");

        object obj = oh.Unwrap();


        // Three ways to use the newly created object, depending on how
        // much is known about the type: Late bound, early bound through 
        // a mutually known interface, or early binding of a known type.
        //
        obj.GetType().InvokeMember("Test", 
            System.Reflection.BindingFlags.InvokeMethod, 
            Type.DefaultBinder, obj, new object[] { "Hello" });

        ITest it = (ITest) obj;
        it.Test("Hi");

        MarshallableExample ex = (MarshallableExample) obj;
        ex.Test("Goodbye");
    }

    public void Test(string greeting)
    {
        Console.WriteLine("{0} from '{1}'!", greeting,
            AppDomain.CurrentDomain.FriendlyName);
    }
}

/* This example produces the following output:

Hello from 'MyDomain'!
Hi from 'MyDomain'!
Goodbye from 'MyDomain'!
 */

异常

异常 异常描述
ArgumentNullException
  • assemblyFile 为 null。
  • typeName 为 null。
FileNotFoundException 未找到 assemblyFile。
TypeLoadException 在 assemblyFile 中找不到 typeName。
AppDomainUnloadedException 尝试对已卸载的应用程序域进行操作。
MissingMethodException 未找到无形参的公共构造函数。
MethodAccessException 调用方的权限不足以调用此构造函数。
BadImageFormatException
  • assemblyFile 不是有效程序集。
  • 当前加载的是 2.0 或更高版本的公共语言运行时,assemblyFile 是用更高版本的公共语言运行时编译的。
FileLoadException 用两个不同的证据将一个程序集或模块加载了两次。
NullReferenceException 此实例为 null。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。