我正在尝试理解.Net4.0中的“沙箱”,但在这个问题上绊倒了,并且不确定如何在C# Windows窗体应用程序中绕过它。
在解决方案资源管理器中,我有两个项目。第一个项目只包含一个Winform,上面只有一个按钮。当我单击该按钮时,代码将调用第二个项目并打开一个OpenFileDialog控件。我不会对all..just进行任何文件读取,试图简单地显示OpenFileDialog控件。我正在管理员权限下运行,但仍然收到以下错误消息:
'System.Security.Permissions.FileIOPermission,System.Security.SecurityException:请求类型为Version=4.0.0.0、Version=4.0.0.0、Culture=neutral、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();
}
}发布于 2013-05-16 20:05:20
您的问题是您为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");我需要做这个改变才能正常工作,但这可能是因为我正在使用一个网络文件夹作为我的开发路径。希望这能帮上忙!
https://stackoverflow.com/questions/16594699
复制相似问题