1

msi インストーラーを呼び出すプログラムがあります。msi パッケージが正常にインストールされた後、msi パッケージによって GAC に追加されたアセンブリを読み込もうとしました。アセンブリをロードできませんが、この特定のアセンブリが GAC に追加されています。プログラムを 2 回目に実行すると、アセンブリが正しく読み込まれます。ここに疑似コードがあります

load assembly(assemblyname)
{
 if(!Assembly.load(assemblyname))
 msi.install();
 Assembly assembly =Assembly.load(assemblyname)
 if(assembly == null)
  console.writeline("assembly not loaded"); 
}

msi パッケージがまだインストールされていない場合、この関数を実行すると、初めてアセンブリが読み込まれません。どういうわけか、これはプログラムが実行される前に存在する GAC リストに関連していると思います。これをリロードする方法はありますか?

4

1 に答える 1

1

投稿された疑似コードは確かに失敗します。CLR は、以前の Assembly.Load() の失敗を記憶しており、アセンブリが使用可能になった場合でも、その後一貫して失敗します。

アセンブリを再度読み込もうとする理由は明らかではありません。インストールが失敗しなかった場合は適切にインストールされていると想定するか、常にインストールしてインストーラーに任せて、アセンブリが既に存在することを検出することで先に進みます。それが現実的でない場合は、IAssemblyCache インターフェースを使用して存在を確認する必要があります (QueryAssemblyInfo() メソッド)。

于 2013-10-14T16:21:26.380 に答える