我在通过 C# 执行 .NET 程序集时遇到了一些重大问题。我想从一个静态类调用一个静态方法(Main)。我让它在当前域中工作,但显然我无法从那里卸载程序集。
首先,我尝试创建一个新的 AppDomain:
AppDomain domain = AppDomain.CreateDomain("PluginDomain");
由于我的主要问题是解决我要加载的程序集,因此我尝试挂钩 AssemblyResolve 事件:
domain.AssemblyResolve += new ResolveEventHandler(this.OnAssemblyResolve);
但是,我得到一个关于序列化的错误(即这个类)。
我已经成功加载了一个程序集文件,该文件恰好位于 BaseDirectory 中,只需使用:
domain.Load("Assembly1");
但是有问题的程序集位于 BaseDirectory 的两个子目录中,即。BaseDirectory\dir1\dir2\Assembly2.dll - 使用带有字符串程序集名称的 domain.Load() (将 PrivateBinPath 设置到正确的子目录位置)以及使用带有程序集字节的 domain.Load() 时,我得到 FileNotFoundException (来自 File.ReadAllBytes())。
我知道 AppDomain.Load() 已被弃用,但考虑到我不想强制包含静态方法的类为非静态且可实例化,这对我来说似乎是唯一可用的方法。
无论如何,我该怎么做才能确保将程序集文件正确加载到新的 AppDomain 中?
我的主要目标是从程序集中动态执行一个方法,该方法可以调用我自己的程序,但在必要时还必须完全卸载程序集。它的目的是有点像一个插件系统。