3

ファイルをロックせずにアセンブリをロードしようとしています。これらのアセンブリはサードパーティのアセンブリである可能性があるため、必ずしもコードにアクセスできるとは限りません。そのうちの1つまたは2つは、Assembly.Locationを使用して、ディレクトリからファイルを読み取ります。

シャドウコピーを介してこれを実行できることは承知していますが、正しく機能させるのは非常に困難であり、特定のフォーラムの一部のユーザーは、アセンブリをバイト配列にロードし、Assembly.Load(Byte [])オーバーロードを使用することを推奨しています。Assembly.Locationは空の文字列を返し、Assembly.Codebaseはアセンブリをロードするアプリケーションの場所を返すため、これは、これらのアセンブリの1つが親ディレクトリ内のファイルにアクセスしようとするまでうまく機能します。

ロードしているアセンブリのCodebaseまたはLocationプロパティを何らかの方法で設定するためにできることはありますか?コードベースと場所に関するMSDNドキュメントでは、それらはオーバーライド可能なプロパティとして定義されています-それは、ホスティングアプリケーションからそれらをオーバーライドできることを意味しますか?

4

2 に答える 2

1

使えますAppDomainSetup.ApplicationBaseか?または、ロードするすべてのアセンブリに対してそのパスを定義する必要がありますか?

編集:ファイル名を使用すると、コードベースを簡単に定義できます。

AssemblyName assemblyRef = new AssemblyName();
assemblyRef.CodeBase = assemblyFile;
Assembly assembly = Assembly.Load(assemblyRef);

たぶんあなたはイベントを使うことができますAppDomain.AssemblyLoadAssembly.ModuleResolve、私は疑います。

于 2009-10-19T13:00:31.507 に答える
0

使用する::

var assembly = Assembly.ReflectionOnlyLoad(System.IO.File.ReadAllBytes(yourFullfileNamePath));

ただし、これは別のAppDomainで行う必要があります。

于 2010-09-06T16:36:40.017 に答える