プラグインをロードできるサンドボックスを作成しようとしています。を作成し、ホスト アセンブリに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 をスローします ( )。PluginHost
FooPlugin
SecurityException
PluginHost
この件に関する MSDN ドキュメントからの私の理解では、StrongName-instances を含む 4 番目のパラメーターは、これらのアセンブリにアプリケーション ドメインでの完全な信頼を与えるということでした。
ドキュメントから:
「新しいアプリケーション ドメインで完全に信頼されていると見なされるアセンブリを表す厳密な名前の配列。」
私は自分が間違っていることを証明したばかりなので、どうすればこれを機能させることができますか? StrongName
に渡したのに、完全に信頼できないのはなぜAppDomain.Create
ですか?