次のプラグインがあります。
IPlugin.cs:
namespace StandalonePlugin
{
public interface IPlugin
{
string Execute(string data);
}
}
StandalonePlugin.cs:
namespace StandalonePlugin
{
[Export(typeof(IPlugin))]
public class StandalonePlugin : IPlugin
{
public string Execute(string data)
{
StringBuilder result = new StringBuilder();
result.AppendFormat("Plugintype: {0}\r\n", this.GetType().FullName);
result.AppendFormat("Data: {0}\r\n", data);
result.AppendFormat("AppDomain: {0}\r\n", AppDomain.CurrentDomain.FriendlyName);
result.AppendFormat("Current Dir: {0}\r\n", Environment.CurrentDirectory);
result.AppendFormat("Assembly location: {0}\r\n", Assembly.GetExecutingAssembly().Location);
return result.ToString();
}
}
}
最後に、プラグインをロードして Execute メソッドを呼び出すコード:
namespace CustomAppDomain
{
class Program
{
static void Main(string[] args)
{
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
setup.PrivateBinPath = @".";
AppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain", null, setup);
string pathToDll = @"D:\Code\LearningPlugins\StandalonePlugin\bin\Debug";
Type t = typeof(IPlugin);
IPlugin plugin = (IPlugin)pluginDomain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);
Console.WriteLine(plugin.Execute("Test"));
Console.WriteLine("<ENTER> to continue");
Console.ReadLine();
}
}
}
出力は次のとおりです。
> Plugintype: StandalonePlugin.StandalonePlugin
> Data: Test
> AppDomain:LearningPlugins.vshost.exe
> Current Dir: D:\Code\LearningPlugins\LearningPlugins\bin\Debug
> Assembly location: D:\Code\LearningPlugins\LearningPlugins\bin\Debug\StandalonePlugin.dll
>
> <ENTER> to continue
ここで質問があります:で指定されているように、 AppDomain がLearningPlugins.exe
ではなく一覧表示されるのはなぜですか?PluginDomain
AppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain", null, setup);
明確にするために、vshost が追加されることは気にしません。なぜ AppDomainPluginDomain
が表示されないのか不思議です。プラグイン用に追加の appdomain を作成したいのに、親の AppDomain が使用されているようです