C#Reflection,AppDomain:从不同的文件夹执行相同的程序集

时间:2011-07-25 12:21:48

标签: c# .net reflection appdomain

我有以下情况。有n个文件夹,每个文件夹包含两个程序集:

Assembly1.dll Assembly2.dll

  • 所有Assembly1.dll都完全相同

  • 所有Assembly2.dll彼此略有不同,但具有相同的类/方法。

  • 所有Assembly1.dll对Assembly2.dll的引用

在我的程序中,我想在Assembly1中创建一个类的实例,并在该类上调用一个方法:

for(int i = 0; i < 100; i++)
{ 
    Assembly myAssembly1 = Assembly.LoadFrom("Directory"+ i + "\\Assembly1.dll");
    Type myType = myAssembly1.GetType("MyClass");

    object myObject = Activator.CreateInstance(myType);
    myType.Invoke(myMethodName, BindingFlags.InvokeMethod, null, myObject, null);
}

为包含Assembly1.dll的每个文件夹执行此段代码 问题是第一个工作正常但后来Assembly2.dll已经加载,不会被重新加载。但是,需要将其替换为当前文件夹(编号i)内的那个。这是因为它略有不同。

每次调用上面的代码时,都会采用相同的assembly2。

我已经搜索了类似的问题,但我发现了一些关于使用自定义 AppDomains 的建议。我尝试过这个,但我无法让它正常工作。

有人可以提供一个代码示例,说明如何初始化新的AppDomain并在此新域中执行上述代码(以便正确加载和卸载引用的Assembly2.dll)?

或者有没有人对如何解决这个问题有不同的想法?

祝福, 基督教

2 个答案:

答案 0 :(得分:1)

检查此http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx和此http://msdn.microsoft.com/en-us/library/ff527268.aspx ...您可以创建AppDomains,加载assembly1并为AssamblyResolve Event分配处理程序,您可以在其中为其提供正确的Assembly2 ... 见Can I specify dependency directories when dynamically loading assemblies?

答案 1 :(得分:0)

我终于开始工作了。对于遇到同样问题的所有人,这是解决方案:

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

string pathToTheDll = "C:\\SomePath\\MyAssembly1.dll";
object obj = myDomain.CreateInstanceFromAndUnwrap(pathToTheDll, "MyAssembly1.TypeName");
Type myType = obj.GetType();

myType.InvokeMember("SomeMethodName", BindingFlags.InvokeMethod, null, obj, null);

AppDomain.Unload(myDomain);

我希望这有助于某人!