2016-10-16 7 views
1

私はWPFデスクトップアプリケーションを持っています。dllをRAMにロードし、RAMにロードされた別のDLLによってアクセス可能にする方法

私の考えはこれです:

私のインストールされたアプリケーションが起動して自分のサーバーに接続します。

クライアントアプリケーションは、ビューとDLLロジック/リソースをRAMにロードします。

これは、ことを私が行う方法です。

var uri = "http://127.0.0.1/Dll/MyControls.Dll"; 
var data = new System.Net.WebClient().DownloadData(uri); 
var ViewAssembly = System.Reflection.Assembly.Load(data); 

foreach (Type type in ViewAssembly.GetExportedTypes()) 
{ 
    if (type.FullName.IndexOf(".Plugin") > 0) 
    { 
     dynamic obj = Activator.CreateInstance(type); 
     UserControl wnd = obj.GetControl(); 
     MainContent.Children.Add(wnd); 
     break; 
    } 
} 

uri = "http://127.0.0.1/Dll/Biz.Dll"; 
data = new System.Net.WebClient().DownloadData(uri); 
var DLLAssembly = System.Reflection.Assembly.Load(data); 
Type myType = DLLAssembly.GetType("Biz.Logic"); 

が今私の「元」のアプリケーションで私の見解は、その参照を経由して私のBiz.Dllからロジックを呼び出します。

しかし、このシナリオでは、DLLはユーザーのハードドライブではなくRAMに読み込まれます。 したがって、私のView(RAMにロードされている)は、DLLをUsersハードドライブに書き込んでいないのにBizDll(RAMにロードされている)のメソッドを呼び出すことは可能ですか?

私のアプローチの理由は、私はすべてのユーザーのPCに小さな物理的な足跡を持ち、コードへのアクセスを制御したいということです。だから、ユーザーがいつでも最新のバージョンを取得し、私はアプリの登録を制御することができるアプリを起動するたびに。

私の主なロジックをすべて私のサーバーに移すことができますが、自分のコードを保護しようとしているわけではなく、ユーザーが良い(つまり一時的に破損した)インターネット接続ができなくても機能します。クライアントからのすべてのサーバー更新をキャッシュし、接続があると更新します。どれアプローチ/アイデアは歓迎されるであろう

私は、遅延バインディング呼び出しを行うために再設計私のコードも可能でしたが、私はそれが私のXAMLで私のバインディングのマークアップでどのように動作するか分からない...

おかげ

答えて

2

あなたはあなたのコードが動作するActivator.CreateInstace呼び出す前に、両方のアセンブリをロードした場合。 DLLがハードドライブまたはバイト配列からAssembly.Loadまでロードされるかどうかは、実行時に違いはありません。したがって、すべての依存関係を事前に知っていれば、すべてを事前にロードできます。

実行時に必要なアセンブリがわからない場合は、いつでもAppDomain.AssemblyResolveイベントにサブスクライブして、要求されたdllだけをダウンロードすることができます。

+0

お返事ありがとうございます。それは多くの意味があります。私は、dllの間にKateバインディングを使用する必要があると思った。ありがとうございました :) –

関連する問題