1

.Net4.0 でサンドボックス化を理解しようとしていますが、この問題につまずき、C# Windows フォーム アプリケーション内で回避する方法がわかりません。

ソリューション エクスプローラー内に 2 つのプロジェクトがあります。最初のプロジェクトには、ボタンが 1 つある Winform が含まれているだけです。ボタンをクリックすると、コードは 2 番目のプロジェクトを呼び出してOpenFileDialogコントロールを開くようになっています。私はファイルの読み取りをまったく行っていません..OpenFileDialogコントロールの単純な表示を試みているだけです。管理者権限で実行していますが、次のエラー メッセージが表示されます。

System.Security.SecurityException: タイプ 'System.Security.Permissions.FileIOPermission、mscorlib、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();
    }
}
4

1 に答える 1

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");

私の作業を行うには、この変更を加える必要がありましたが、開発パスにネットワーク フォルダーを使用していることが原因である可能性があります。それが役立つことを願っています!

于 2013-05-16T20:05:20.833 に答える