2

次のプラグインがあります。

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ではなく一覧表示されるのはなぜですか?PluginDomainAppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain", null, setup);

明確にするために、vshost が追加されることは気にしません。なぜ AppDomainPluginDomainが表示されないのか不思議です。プラグイン用に追加の appdomain を作成したいのに、親の AppDomain が使用されているようです

4

2 に答える 2

0

を使用しているからですAppDomain.CurrentDomain.FriendlyName

msdn で説明されているように ( http://msdn.microsoft.com/en-us/library/system.appdomain.friendlyname )

既定のアプリケーション ドメインのフレンドリ名は、プロセス実行可能ファイルのファイル名です。

=> LearningPlugin.exe をあなたに

だからそういうの作ればいいのに

メインで:

Console.WriteLine(plugin.Execute("Test", pluginDomain));

スタンドアロン プラグインの場合:

public string Execute(string data, AppDomain childDomain)
        {
            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", childDomain.FriendlyName);//CHANGE HERE
            result.AppendFormat("Current Dir: {0}\r\n", Environment.CurrentDirectory);
            result.AppendFormat("Assembly location: {0}\r\n", Assembly.GetExecutingAssembly().Location);

            return result.ToString();
        }
于 2012-05-22T11:39:26.760 に答える
0

アプリケーションをデバッグ モードで起動すると、フレンドリ名に vshost が追加されます。回避策は正規表現を使用することです

string myName = Regex.Replace(AppDomain.CurrentDomain.FriendlyName, 
    @"(?<basename>.*).vshost(?<extension>\..*)", "${basename}${extension}");

vshostの目的AppDomain.FriendlyName の問題
も確認できます

于 2012-05-22T11:29:44.657 に答える