事实证明,运行时根本不知道在哪里可以找到程序集。虽然其他元数据引用在众所周知的地方,
MyReference.dll
不存在于内存以外的任何位置。我想这是因为运行时并不真正关心元数据引用是从哪里读取的,但我真的不确定。
解决方案很简单,只需创建
AssemblyLoadContext
并手动指向正确的字节:
var loadContext = new AssemblyLoadContext("testLoadContext");
loadContext.Resolving += (loader, name) =>
{
if (name.Name!.Contains("MyReference.dll"))
{
return Assembly.Load(referenceBytes.ToArray());
}
return null;
};
var asm = loadContext.LoadFromStream(mainAssembly);
asm.GetType("Program")!.GetMethod("Main")!.Invoke(null, null);