カスタム AppDomain と PermissionSet を使用すると、IronPython で奇妙な問題が発生します。何らかの理由で、PermissionSet が Unrestricted ではなく、x64 プラットフォームをターゲットにしてビルドすると、double から float へのキャストが正しく機能しません。x86 プラットフォームを対象にビルドするか、PermissionState.Unrestricted を使用すると、問題は解決します。また、PermissionState.None から始めて、ここにリストされているすべてのアクセス許可を無制限として追加しようとしましたが、まだ機能しません。.NET 4.0 に IronPython 2.7.4 を使用しています。以下は、問題を再現する簡単なプログラムです。ここで何が起こっているのか分かりますか?
using IronPython.Hosting;
using System;
using System.Security;
using System.Security.Permissions;
namespace TestApp
{
public class Program
{
private const string Test = @"
from System import Console
num = float(10.0)
Console.WriteLine(num)
";
public static void Main(string[] args)
{
// Prints 10 always
var permissionSet1 = new PermissionSet(PermissionState.Unrestricted);
RunTest(permissionSet1);
// Prints 0 on x64 builds
var permissionSet2 = new PermissionSet(PermissionState.None);
permissionSet2.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
RunTest(permissionSet2);
Console.ReadKey();
}
private static void RunTest(PermissionSet permissionSet)
{
var appDomainSetup = new AppDomainSetup { ApplicationBase = "." };
var evidence = AppDomain.CurrentDomain.Evidence;
var appDomain = AppDomain.CreateDomain("ScriptingSandbox", evidence, appDomainSetup, permissionSet);
var scriptEngine = Python.CreateEngine(appDomain);
var scriptSource = scriptEngine.CreateScriptSourceFromString(Test);
scriptSource.Execute();
}
}
}