2

プラグインをロードできるサンドボックスを作成しようとしています。を作成し、ホスト アセンブリにAppDomainを指定しStrongNameました。私の理解では、厳密に名前が付けられたアセンブリで実行されているコードはすべて完全信頼で実行されます。しかし、そうではないようです。

例、

static void Main(string[] args)
{
    var permissions = new PermissionSet(PermissionState.None);
    var setup = new AppDomainSetup()
        {
            ApplicationBase = "C:\\Temporary\\Sandbox"
        };

    var domain = AppDomain.CreateDomain("Sandbox",
                                        null,
                                        setup,
                                        permissions,
                                        typeof (PluginHost).Assembly.Evidence.GetHostEvidence<StrongName>());

    var handle = Activator.CreateInstanceFrom(domain,
                                                typeof (PluginHost).Assembly.ManifestModule.FullyQualifiedName,
                                                typeof (PluginHost).FullName);

    var host = (PluginHost) handle.Unwrap();
    host.RunPlugin();
}

PluginHost (厳密な名前を付けているのと同じアセンブリで定義)、

public class PluginHost : MarshalByRefObject
{
    public void RunPlugin()
    {
        File.ReadAllText("C:\\Passwords.txt");

        var asm = Assembly.LoadFile(@"C:\Plugins\UnsafePlugin.dll");
        var t = asm.GetType("UnsafePlugin.FooPlugin");

        object plugin = Activator.CreateInstance(t);
        plugin.GetType().GetMethod("Run").Invoke(plugin, null);
    }
}

そして、これはプラグインです(外部アセンブリに存在します)

public class FooPlugin
{
    public void Run()
    {
        File.ReadAllText("C:\\Passwords.txt");
    }
}

含まれているアセンブリに厳密な名前を付けているため、パスワードファイルをからではなくからPluginHost読み取ることができると期待していますが、ファイルを読み取るときにコードが a をスローします ( )。PluginHostFooPluginSecurityExceptionPluginHost

この件に関する MSDN ドキュメントからの私の理解では、StrongName-instances を含む 4 番目のパラメーターは、これらのアセンブリにアプリケーション ドメインでの完全な信頼を与えるということでした。

ドキュメントから:

「新しいアプリケーション ドメインで完全に信頼されていると見なされるアセンブリを表す厳密な名前の配列。」

私は自分が間違っていることを証明したばかりなので、どうすればこれを機能させることができますか? StrongNameに渡したのに、完全に信頼できないのはなぜAppDomain.Createですか?

4

0 に答える 0