.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();
}
}