2011-08-08 15 views
5

私は起動時にいくつかのdllライブラリをロードし、誰かがそれらを削除できるようにファイルをリリースする子app-domainを持っています。起動時にアセンブリを子AppDomainにロードしてdllファイルを解放する

私は以下のクラスのための

Loader al = (Loader)domain.CreateInstanceAndUnwrap(
typeof(Loader).Assembly.FullName, 
typeof(Loader).FullName); 
al.Load(path) 

を行います。

class Loader : MarshalByRefObject 
{ 
    internal void Load(string path) 
    { 
     Assembly assembly; 
     try 
     { 
      assembly = Assembly.Load(File.ReadAllBytes(path)); 
     } 
     catch (Exception) { return; } 
    } 
    internal UseType(string fullyQualifiedTypeName) 
    { 
     Type userType = Type.GetType(fullyQualifiedTypeName); 
    } 
} 

後、私はUseTypeを呼び出すと、私は正しい型を取得しますが、子アプリドメインは、DLLをロックしているかのようですので、私はこれ以上のファイルを削除することはできませんよ。

基本的に私が達成したいのは、起動時にアセンブリファイルをキャッシュし、後でGetType呼び出しを使用して、実際のdllファイルが解放されるようにすることです。

これは本当に可能ですか?

+0

CreateInstanceAndUnwrap()は、プライマリappdomainにロードされた型も取得します。これはファイルをロックします。別のアセンブリで定義されたインタフェースタイプを使用します。 –

+0

ロックするローダーを含むファイルを持っていても問題ありません。または、Loaderのメソッドで使用される任意の型は、アセンブリを親app-domainにロードするようにしますか? – Egor

+0

参照:http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins

答えて

5

アプリケーションドメインの作成時にシャドウコピーを使用します。これはdllをキャッシュにコピーし、誰でもファイルシステムとやりとりすることができます。

トップシェルフはシェルビングでこれを行います(すべては、それ自身のアプリドメイン内にあります) - https://github.com/Topshelf/Topshelf/blob/v2.3/src/Topshelf/Model/ShelfReference.cs#L126

更新:トップシェルフはもはやこれを行いませんでしたが、それを行ったバージョンへのリンクを更新しました。

+0

あなたの答えをありがとう! – Egor

+0

問題ありません、うまくいけば助けました! – Travis

+0

はい、助けました!ライブラリがカスタムソースからのものである場合は、必要なShadowCopyDirectoriesプロパティも設定する必要があります。 – Egor