我希望它不会重复,我看到很多类似的问题,但是他们中的任何一个都无法帮助我。
我在 nameofdll.dll 中有这样的方法代码:
DllMethod()
{
Assembly assembly = Assembly.GetExecutingAssembly();
Type type = assembly.GetType("Class");
MethodInfo method = type.GetMethod("Method");
object obj = Activator.CreateInstance(type);
method.Invoke(...);
}
和Class - 构造函数添加AssemblyResolver
class Class
{
public Class()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
}
public void Method()
{...}
private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
{...}
}
直到我从我的主app.exe调用metod时调用 AssemblyResolver ,该app.exe与 nameofdll.dll 位于同一文件夹中,让我们将该文件夹命名为 mainfolder 以及PowerShell脚本以这种方式:
load dll(mainfolder + nameofdll.dll)
call DllMethod()
一切正常,但我必须卸载AssemblyResolver加载的dll,因为Method被多次调用不同的dll版本。
所以我修改了DllMethod():
{
Assembly assembly = Assembly.GetExecutingAssembly();
MethodInfo method = type.GetMethod("Method");
//new part
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = Path.GetDirectoryName(assembly.Location);
AppDomain Domain = AppDomain.CreateDomain(Class, null, domainSetup);
object obj = Domain.CreateInstanceAndUnwrap(assembly.FullName, Class);
method.Invoke(...);
AppDomain.Unload(Domain);
}
我用 domainSetup.ApplicationBase = Path.GetDirectoryName(assembly.Location); 因为BaseDirecotry是powershell文件夹而CreateInstanceAndUnwrap无法找到nameofdll.dll。
最后问题是,当使用app.exe时,每个人都可以,但是当我从powershell脚本调用那个dll方法时,没有调用AssemblyResolver,我立刻得到错误,它无法加载一些dll。
我还尝试复制域名设置,然后添加
AppDomainSetup domainSetup = AppDomain.CurrentDomain.SetupInformation;
其中CurrentDomain
是AssemblyResolver之前正常工作的域,但它没有解决问题。