我正在尝试找到一种在运行时编译程序集并加载它们的方法。基本意图是将它们存储在不在磁盘上的数据库中。所以我写了一些代码,但看到了一个有趣的情况。这是我的代码:
//SumLib
namespace SumLib
{
public class SumClass
{
public static int Sum(int a, int b)
{
return a + b;
}
}
}
// Console app
class Program
{
public static void AssemblyLoadEvent(object sender, AssemblyLoadEventArgs args)
{
object[] tt = { 3, 6 };
Type typ = args.LoadedAssembly.GetType("SumLib.SumClass");
MethodInfo minfo = typ.GetMethod("Sum");
int x = (int)minfo.Invoke(null, tt);
Console.WriteLine(x);
}
static void Main(string[] args)
{
AppDomain apd = AppDomain.CreateDomain("newdomain", AppDomain.CurrentDomain.Evidence, AppDomain.CurrentDomain.SetupInformation);
apd.AssemblyLoad += new AssemblyLoadEventHandler(AssemblyLoadEvent);
FileStream fs = new FileStream("Sumlib.dll", FileMode.Open);
byte[] asbyte = new byte[fs.Length];
fs.Read(asbyte, 0, asbyte.Length);
fs.Close();
fs.Dispose();
// File.Delete("Sumlib.dll");
apd.Load(asbyte);
Console.ReadLine();
}
}
代码运行完美,删除行被注释掉,如果我取消注释,应用程序域加载程序集,AssemblyLoadEvent()
方法运行,我在控制台上看到数字 9,但是当方法结束时apd.Load()
抛出错误:“无法加载文件或程序集。” 这是完全合理的。
AssemblyLoadEvent()
问题是:如果没有光盘上的程序集文件,方法如何运行?
如果该方法在原始二进制数据的帮助下以某种方式运行,那么 appdomain 是否有任何Load()
方法成功完成该方法?