C# Winforms - 尝试通过将 FileDialogPermission 添加到 AppDomainSetup 来显示 OpenFileDialog
Posted
技术标签:
【中文标题】C# Winforms - 尝试通过将 FileDialogPermission 添加到 AppDomainSetup 来显示 OpenFileDialog【英文标题】:C# Winforms - Trying to display OpenFileDialog by adding FileDialogPermission to AppDomainSetup 【发布时间】:2013-05-16 18:23:26 【问题描述】:我正在尝试了解 .Net4.0 中的沙盒,但偶然发现了这个问题,并且不确定如何在 C# Windows 窗体应用程序中解决它。
在解决方案资源管理器中,我有 2 个项目。第一个项目只包含一个带有单个按钮的 Winform。当我单击按钮时,代码将调用第二个项目并打开一个OpenFileDialog
控件。我根本没有进行任何文件读取..只是试图简单地显示OpenFileDialog
控件。
我在管理员权限下运行,但仍然收到以下错误消息:
System.Security.SecurityException:请求类型的权限 'System.Security.Permissions.FileIOPermission, mscorlib, 版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' 失败了。
不胜感激,以下是实际代码:
//Project 1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security;
using System.Security.Permissions;
using ClassLibrary1;
namespace DeleteSandboxing
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
//STEP1 - Setup the "PermissionSet"
PermissionSet permSet = new PermissionSet(PermissionState.None);
permSet.AddPermission(newSecurityPermission
(SecurityPermissionFlag.Execution));
permSet.AddPermission(new UIPermission(UIPermissionWindow.AllWindows));
permSet.AddPermission(new
FileDialogPermission(FileDialogPermissionAccess.Open));
//STEP2 - Setup the "AppDomainSetup"
AppDomainSetup objSetup = new AppDomainSetup();
objSetup.ApplicationBase =
AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
//STEP3 - Create the "AppDomain"
AppDomain domain = AppDomain.CreateDomain("New domain name",
AppDomain.CurrentDomain.Evidence, objSetup, permSet);
//STEP4 - Call "ShowDialog()" via the interface i1.
Interface1 i1 =
(ClassLibrary1.Class1)domain.CreateInstanceFromAndUnwrap("ClassLibrary1",
"ClassLibrary1.Class1");
i1.ShowDialog();
//Project 2:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
using System.Reflection;
namespace ClassLibrary1
public class Class1:MarshalByRefObject,Interface1
public void ShowDialog()
OpenFileDialog obj = new OpenFileDialog();
obj.ShowDialog();
public interface Interface1
void ShowDialog();
【问题讨论】:
【参考方案1】:您的问题是您添加了OpenFileDialog
的权限,但您没有分配任何FileIOPermission
,因此对话框本质上需要一些文件访问权限。您可以通过几种不同的方式将此权限分配给您的 PermissionSet
对象:
如果您想在您的OpenFileDialog
中不受限制的文件打开访问:
permSet.AddPermission(new FileIOPermission(PermissionState.Unrestricted));
如果您只想授予对指定路径的文件打开访问权限:
permSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, "path_name"));
有了这种权限,你还需要设置OpenFileDialog
的默认目录;
OpenFileDialog obj = new OpenFileDialog();
obj.InitialDirectory = "path_name_defined_in_permissions";
obj.ShowDialog();
您可能还需要在“步骤 4”中更改程序集名称以反映文件扩展名:
Interface1 i1 =
(ClassLibrary1.Class1)domain.CreateInstanceFromAndUnwrap("ClassLibrary1.dll",
"ClassLibrary1.Class1");
我需要进行此更改以使我的工作正常,但这可能是因为我使用网络文件夹作为我的开发路径。希望对您有所帮助!
【讨论】:
感谢您加倍努力并告诉我指定路径的开放访问权限。你的冠军! 很高兴它对你有用!请将我的答案标记为答案 =)以上是关于C# Winforms - 尝试通过将 FileDialogPermission 添加到 AppDomainSetup 来显示 OpenFileDialog的主要内容,如果未能解决你的问题,请参考以下文章
C# WinForms - 在同一 TreeViewControl 中拖放