我想问一个问题,以实现AppDomain和Activator之间的区别,我通过appdomain.CreateInstance加载了我的dll。但我意识到创建实例的方法更多。因此,何时或何地选择此方法? 例1:
// Use the file name to load the assembly into the current
// application domain.
Assembly a = Assembly.Load("example");
// Get the type to use.
Type myType = a.GetType("Example");
// Get the method to call.
MethodInfo myMethod = myType.GetMethod("MethodA");
// Create an instance.
object obj = Activator.CreateInstance(myType);
// Execute the method.
myMethod.Invoke(obj, null);
例2:
public WsdlClassParser CreateWsdlClassParser()
{
this.CreateAppDomain(null);
string AssemblyPath = Assembly.GetExecutingAssembly().Location;
WsdlClassParser parser = null;
try
{
parser = (WsdlClassParser) this.LocalAppDomain.CreateInstanceFrom(AssemblyPath,
typeof(Westwind.WebServices.WsdlClassParser).FullName).Unwrap() ;
}
catch (Exception ex)
{
this.ErrorMessage = ex.Message;
}
return parser;
}
示例3:
private static void InstantiateMyTypeSucceed(AppDomain domain)
{
try
{
string asmname = Assembly.GetCallingAssembly().FullName;
domain.CreateInstance(asmname, "MyType");
}
catch (Exception e)
{
Console.WriteLine();
Console.WriteLine(e.Message);
}
}
你能解释一下为什么我需要更多的方法或有什么区别?
答案 0 :(得分:3)
从sscli2.0源代码看,AppDomain类中的“CreateInstance”方法调用总是将调用委托给Activator。
(几乎是静态的) Activator 类的唯一目的是“创建”各种类的实例,而 AppDomain 的引入则完全不同(也许更有野心) )目的,例如:
第1和第3个例子很简单,就像zmbq所说的那样。我想你的第二个例子是来自 post ,其中作者展示了如何使用AppDomain卸载过时的代理。
答案 1 :(得分:2)
第一个从程序集'example'创建一个Example
类型的实例,并在其上调用MethodA
。
第三个在不同的AppDomain
MyType
的实例
我不确定第二个,我不知道this
是什么,但似乎在当前app-domain中创建一个类 - 也就是说,它是类似于第一个。