2016-10-28 6 views
0

実行時に複数のアセンブリをメモリから複数回ロードする必要があります。私はまた、これらのアセンブリをいくつか変更した後で再ロードする可能性があります。バイトからアセンブリを動的にロードする

私は標準Assembly.Load方法を試してみたと私は再び同じアセンブリをロードしたとき、私が達成したいものではありませんどの

AppDomain.CurrentDomain.GetAssemblies() 

に二回登場していることが実現するまで、それがうまく働きました複数のロード操作のために発生します。私は、ディスクからDLLをロードする場合、それが変更されていない形式であればロードしないことを知っています。

それから私は、新しいAppDomainのにロードするDLLをしてみましたが、私は依存関係に問題を抱えて。ここで

がシナリオを簡素化されます。

私はDLLを共有している、メインアプリケーションによって参照されるAssemblyA、それを呼び出します。

私は動的にロードする(AssemblyB ... Zと呼ぶ)いくつかのDLLもあります。これらのDLLはAssemblyAも参照しています。

私の主なアプリケーションは、前述のように、メインアプリケーション(LoadAssembliesと呼ばれる)によって実装されたメソッドを持つ抽象クラスを持つAssemblyAを参照しています。このメソッドは、新しいAppDomainを使用して動的に残りのアセンブリをロードするために使用されます。

could not load assembly or one of its dependencies 

public override void LoadAssemblies() 
{ 
AppDomain pluginDomain = AppDomain.CreateDomain("PluginDomain"); 


foreach (byte[] xmlDLL in listOfDLLS) 
{ 
    Assembly reflection = Assembly.ReflectionOnlyLoad(xmlDLL); 


    foreach (var dependencies in reflection.GetReferencedAssemblies()) 
    { 
     if (dependencies.Name.Equals("AssemblyA")) 
     { 
      Assembly pluginr = Assembly.ReflectionOnlyLoad(AssemblyA); 
       foreach (var d in pluginr.GetReferencedAssemblies()) 
        pluginDomain.Load(d); 
        pluginDomain.Load(plugin); 
     } 
     else 
      pluginDomain.Load(dependencies); 
    }   
    Assembly assembly = pluginDomain.Load(xmlDLL); 
} 

上記のコード、そのことを言っ線

Assembly assembly = pluginDomain.Load(xmlDLL); 

にエラーを取得している:ここ

はLoadAssembliesの現在のコードは、(I手動ロード依存性と試み)であります

AssemblyResolverイベントでも試してみましたが、Serializableについて不平を言っています。型についてはシリアライズ可能。

PS。残念ながら、私はディスクにDLLを保存することはできません。

+0

'AppDomain'から' Assemblies'をアンロードする方法はありませんが、 'AppDomain'をアンロードすることはできます。アセンブリを変更した後、新しい 'AppDomain'を作成することは可能でしょうか?また、私はあなたのバッファに正しく読み込まれていると仮定しています。 – Andy

+0

さて、私はそれを知っている、これは私がそれを実装する方法です。バイトは100%正確です。 – Kraviec

答えて

0

回避策が見つかりました。

pluginDomain.SetData("Assembly", DLLinByteArray); 
pluginDomain.DoCallBack(CallbackFunction) 

を私はカスタムのAppDomain内で何かをする必要があるとき:ソリューションは、使用することです。あなたは、私がコールバックメソッドにパラメータを送信するための方法SetDataメソッドのGetDataを使用して見ることができるように

byte[] assemblyToLoad = (byte[])AppDomain.CurrentDomain.GetData("Assembly"); 
Assembly.Load(assemblyToLoad); 

:バイト配列からロードするDLLの例えば

CallbackFunctionは次のようになります。

カスタムAppDomainにあるDLLからメソッドを呼び出すために、私は別のCallbackFunctionの中でこれを行います。

関連する問題