我注意到显示FolderBrowserDialog
会导致我的计算机上加载的任何外壳扩展程序中的程序集被加载到我的应用程序AppDomain
中。这是causing problems我的应用程序作为我的应用程序使用的旧版本的库正在加载。我认为可能的解决办法是在另一个FolderBrowserDialog
中打开AppDomain
,然后卸载AppDomain以卸载所有加载的shell扩展程序集。例如:
public class Form1 : Form
{
public Form1()
{
var setup = new AppDomainSetup()
{
ApplicationBase = System.Environment.CurrentDirectory,
DisallowBindingRedirects = false,
DisallowCodeDownload = true,
ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
};
var ad = AppDomain.CreateDomain("FolderBrowser", null, setup);
var type = typeof(MyFolderBrowserDialog);
var diag = (MyFolderBrowserDialog)ad.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
diag.ShowDialog();
AppDomain.Unload(ad);
}
}
public class MyFolderBrowserDialog : MarshalByRefObject
{
public DialogResult ShowDialog()
{
using (var diag = new FolderBrowserDialog())
{
return diag.ShowDialog();
}
}
}
但这不起作用。 shell扩展程序集仍然加载到应用程序的普通AppDomain中,并且没有像我预期的那样加载到新的AppDomain中。作为测试,我创建了自己的类,它调用Shell32.dll中的本地SHBrowseForFolder
函数,发现调用是导致程序集加载的原因。
因此,如果使用AppDomains only works with managed code进行沙盒处理,您如何使用P / Invoke沙箱非托管代码?如果您运行不受信任的代码或者至少是可靠性问题,我可以将此视为潜在的安全问题,因为您无法通过打开保存或浏览对话框来了解客户计算机上可能加载的程序集