我遇到以下情况......
1) 在应用程序中创建域。
2) 我们通过DoCallBack程序集加载到其中Assembly.Load(...)
3) 我们从主域中获取先前创建的程序集,例如,显示它们的名称。
4) 我们查看主域中有哪些程序集,更具体地说,这个程序集出现在那里,我们将其上传到另一个域。
也就是说,当将程序集加载到另一个域时,如果您调用该方法GetAssemblies,加载的程序集也会出现在主域中,它们不仅会传输到那里,还会被复制——它们可以在两个域中使用。
如果你循环这个过程并观察内存,你可以看到它在增长,这意味着程序集每次都被加载到内存中。
最大的问题是为什么?如何摆脱将程序集移动到主域?这甚至不是内存问题,而是主域持有对程序集的引用并且不允许删除它的事实,例如。而且您需要以某种方式提取信息。
class Program
{
static void Main ( string [ ] args )
{
var appDomain = AppDomain.CreateDomain("TestDomain");
appDomain.DoCallBack(LoadModule);
var assembly = appDomain.GetAssemblies().Single( t => t.GetName().Name == "TestModule" );
foreach ( var assembly1 in AppDomain.CurrentDomain.GetAssemblies() )
{
Console.WriteLine( assembly1.FullName );
}
}
private static void LoadModule()
{
Assembly.Load( "TestModule" );
}
}