首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# Winforms -试图通过向OpenFileDialog添加FileDialogPermission来显示AppDomainSetup

C# Winforms -试图通过向OpenFileDialog添加FileDialogPermission来显示AppDomainSetup
EN

Stack Overflow用户
提问于 2013-05-16 18:23:26
回答 1查看 1.4K关注 0票数 1

我正在尝试理解.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‘的许可失败。

非常感谢您的帮助,下面是实际代码:

代码语言:javascript
复制
 //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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-16 20:05:20

您的问题是您为OpenFileDialog添加了权限,但没有分配任何FileIOPermission,因此该对话框本质上需要一些文件访问权限。您可以将这个过程分配给您的PermissionSet对象几种不同的方式:

如果要在OpenFileDialog中打开不受限制的文件访问权限

代码语言:javascript
复制
    permSet.AddPermission(new FileIOPermission(PermissionState.Unrestricted));

如果只允许打开文件访问指定的路径:

代码语言:javascript
复制
    permSet.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read, "path_name"));

有了这种权限,您还需要设置OpenFileDialog的默认目录;

代码语言:javascript
复制
    OpenFileDialog obj = new OpenFileDialog();
    obj.InitialDirectory = "path_name_defined_in_permissions";
    obj.ShowDialog();

您还可能需要更改“步骤4”中的程序集名称,以反映文件扩展名:

代码语言:javascript
复制
         Interface1 i1 =
        (ClassLibrary1.Class1)domain.CreateInstanceFromAndUnwrap("ClassLibrary1.dll",
        "ClassLibrary1.Class1");

我需要做这个改变才能正常工作,但这可能是因为我正在使用一个网络文件夹作为我的开发路径。希望这能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16594699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档