3

さまざまな理由で GAC に登録できない .NET ライブラリを作成しています。この dll (SDK.dll と呼びましょう) は、他の DLL に依存してロードされます。

この SDK.dll を使用するプログラムを作成しているときに、プログラムが dll の読み込みに失敗し、FileNotFoundException がスローされることに気付きました。これは、参照されている SDK.dll を見つけることはできたものの、CLR がその依存関係を読み込めなかったために発生します。

この問題を解決するために私が見つけた唯一の方法は、SDK.dll とそのすべての依存関係を「ローカルにコピー」すること (展開の問題のために実行できないこと)、またはプログラムを SDK.dll と同じディレクトリにコンパイルすることです。

その場所に関係なく、その依存関係を探す場所を SDK.dll に伝える方法はありますか? おそらくSDK.dll.configファイルが役に立ちますか?

4

5 に答える 5

8

このイベントをサブスクライブすることで、実行時にこれを処理できます。

AppDomain.CurrentDomain.AssemblyResolve

ランタイムがアセンブリの解決に失敗したときに発生します。イベント ハンドラー メソッドで、アセンブリを検索し、Assembly.LoadFrom() を使用して読み込むロジックを記述します。次のようになります。

public SDKClass()
{
  AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(FindAssembly);
}

private Assembly FindAssembly(object sender, ResolveEventArgs args)
{
  string assemblyPath = "c:\PathToAssembly";
  string assemblyName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
  string assemblyFullName = Path.Combine(assemblyPath, assemblyName);

  Assembly theAssembly = Assembly.Load(assemblyFullName);

  return theAssembly;
}
于 2008-12-10T15:25:58.227 に答える
0

アセンブリをGACに登録するには、厳密な名前で署名されている必要があります。

他のアセンブリに依存する場合、それらはGACにある必要があります。

BeowulfOF

于 2008-12-10T14:05:29.967 に答える
0

SDKをGACすることはできませんが、依存関係をGACすることはできますか?

アセンブリバインディングに関するこのmsdnの記事も読んでください。

http://msdn.microsoft.com/en-us/library/efs781xb(VS.71).aspx

アセンブリに強い名前が付けられている場合は、コードベースを使用できます。そうでない場合は、コードベースはisntallの子ディレクトリである必要があります。これは役に立ちません。

于 2008-12-10T14:10:10.657 に答える
0

Re: スヌーガンツ

次のように、Load の代わりにLoad Fileを使用することをお勧めします。

Assembly theAssembly = Assembly.LoadFile(assemblyFullName);

Assembly.Loadおそらく無限ループに陥ります=)

于 2009-09-29T14:17:37.297 に答える
0

DEVPATH 環境変数を使用してみてください。

http://msdn.microsoft.com/en-us/library/cskzh7h6.aspx

于 2008-12-10T14:53:41.617 に答える