私は起動時にいくつかの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ファイルが解放されるようにすることです。
これは本当に可能ですか?
CreateInstanceAndUnwrap()は、プライマリappdomainにロードされた型も取得します。これはファイルをロックします。別のアセンブリで定義されたインタフェースタイプを使用します。 –
ロックするローダーを含むファイルを持っていても問題ありません。または、Loaderのメソッドで使用される任意の型は、アセンブリを親app-domainにロードするようにしますか? – Egor
参照:http://stackoverflow.com/questions/6480140/appdomain-shadow-copying-not-working-original-assemblies-locked – cdiggins