5

私のソリューションの 1 つのプロジェクトがレポートを作成する巨大なアプリケーションがあります。.dllプロジェクトをビルドせずに、ファイルを追加するだけで、新しいレポート (更新レポート) を追加したい。Assemblyと について読みましAppDomainたが、新しいレポートに新しい dll を追加し、実行時に古いレポートを更新する方法が本当に良い方法なのかわかりません。これが私の例です。最初のdllは必要ですが、2回目は必要ありません。最初の dll - 合計、2 番目 - 差し引かれます。

    static void Main(string[] args)
    {
        try
        {
            //first domain
            AppDomain domain = AppDomain.CreateDomain("MyDomain");
            AssemblyDll asb1 = new AssemblyDll();
            Console.WriteLine(asb1.AssemblyMethod(1));
            AppDomain.Unload(domain);
            Console.ReadKey();

            //second domain
            AppDomain newDomain = AppDomain.CreateDomain("myNewDomain");
            AssemblyDll asb2 = new AssemblyDll();
            Console.WriteLine(asb2.AssemblyMethod(2));
            AppDomain.Unload(newDomain);
            Console.ReadKey();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

public class AssemblyDll
{
    public string AssemblyMethod(int version)
    {
        //loading .dll
        Assembly assembly = Assembly.LoadFrom(@"../../../../Assembly/DynamicDLL" + version + ".dll");
        Type type = assembly.GetType("DynamicDLL.Dynamic");
        object instance = Activator.CreateInstance(type);
        MethodInfo[] methods = type.GetMethods();
        //invoke method
        object result = methods[0].Invoke(instance, new object[] { 5, 3 });
        return result.ToString();
    }
}

私の.dllファイルは次のものから来ています:

namespace DynamicDLL
{
    public class Dynamic
    {
        public int DynamicMethod(int a, int b)
        {
            return a + b;
            //return a - b;
        }
    }
}
4

2 に答える 2

3

アセンブリは通常、1 回だけ読み込まれ、AppDomain一度読み込まれるとアンロードできません。

新しいものを作成しAppDomainてこれにアセンブリをロードできます。これを解放すると、アセンブリはアンロードされます。ただし、ここでの注意点は、2 つの間で直接通信することはできないためAppDomain、リモーティングなどの他の方法を使用して 2 つの間でマーシャリングする必要があることです。

プラグインとプラグインをアンロード可能にすることに関して、これについて多くのことが書かれています.Googleの簡単な検索では、これらが提示されました:

http://www.brad-smith.info/blog/archives/500

http://adrianvintu.com/blogengine/post/Unloadable-plugins.aspx

うまくいけば、これらはあなたを助けるでしょう.

于 2013-10-01T12:16:26.800 に答える
3

プラグインのようなものを作成し、プラグインのアプローチが好きな場合は、MEF http://msdn.microsoft.com/en/library/vstudio/dd460648.aspxをご覧ください。

MEF を使用すると、任意のアセンブリを動的に使用でき、dll をフォルダーにドロップして、そこから MEF カタログを構築することもできます。

実際にはVisual Studioであり、拡張性のために内部でMEFを使用しています(プラグイン...)

于 2013-10-01T12:22:22.000 に答える