我有以下情况。有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)?
或者有没有人对如何解决这个问题有不同的想法?
祝福, 基督教
答案 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);
我希望这有助于某人!