3

私のプロジェクト A はプロジェクト B を参照しています。プロジェクト B はサード パーティのアセンブリへの参照を保持しています。プロジェクト A は、プロジェクト B およびサード パーティのアセンブリとは別のフォルダーにあります (別のソフトウェアとの統合のため)。統合フォルダーにアセンブリを配置できることはわかっていますが、モジュールの診断とセットアップに使用する実行可能ファイルと一緒に他のすべてのアセンブリを配置した独自のフォルダーにアセンブリを配置したいと考えています。

MyResolveEventHandlerでプロジェクト Aをサブスクライブし、AppDomain.CurrentDomainプロジェクト B の正しいアセンブリ パスを正常に設定できます。この問題は、プロジェクト A が、サード パーティのアセンブリが使用されているプロジェクト B のメソッドを呼び出すときに発生します。次に、そのアセンブリをスローFileNotFoundExceptionし、 でプロジェクト B に設定したフォルダーではなく、統合フォルダーのパスを表示しますMyResolveEventHandler

を試してみましAppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(@"pathOf3rdPartyAssembly"))たが、アセンブリが に正常に読み込まれたことがわかりますが、上記Appdomainと同じものがスローされます。FileNotFoundException

プロジェクト A からプロジェクト B 内で使用されるサード パーティ製アセンブリのアセンブリ パスを設定するにはどうすればよいですか?


編集: 申し訳ありませんが、問題は私自身の隠れたバグが原因でした。FileNotFoundException をスローしていた dll ハイジャック対策を実装しました。実際、プロジェクト B の正しいアセンブリ パスが設定されている場合、これはプロジェクト B で参照されているサード パーティ アプリケーションにも有効です。質問をし、質問をした後。今、私は先に進まなければなりません... :) すべての提案に感謝します! 私はあなたの両方に賛成票を投じます...

4

2 に答える 2

1

サード パーティ製アセンブリのカスタム プローブ パスをセットアップできます。このアプローチは、ASP.NET アプリケーションでは機能しないことに注意してください (カスタム プローブ パスはサポートされていません)。

于 2013-07-31T09:02:21.653 に答える
1

resolveEvent ハンドラ内でこれを使用してみてください

return System.Reflection.Assembly.LoadFrom(@"pathOf3rdPartyAssembly")

私が普段使っているパターンは

Private Sub MyApplication_Startup(sender As Object, e As ApplicationServices.StartupEventArgs) Handles Me.Startup
    AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf Me.OnAssemblyResolveHandler
End Sub

Private Function OnAssemblyResolveHandler(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
    If args.Name.StartsWith("assemblyName,") Then Return System.Reflection.Assembly.LoadFrom(@"pathOf3rdPartyAssembly")
    Return Nothing
End Function

解決イベント ハンドラーは、見つかったアセンブリを返すことを期待しているため、または既定の検索パターンを使用して例外をスローするため、i のような名前だけを使用するのではなく、アセンブリを識別するより強力な方法を実装することをお勧めします。行う!

Ps これは vb.net ですが、c# に簡単に変換できます

Private System.Reflection.Assembly OnAssemblyResolveHandler(Object sender, ResolveEventArgs args)
{
    if (args.Name.StartsWith("assemblyName,")) { Return System.Reflection.Assembly.LoadFrom(@"pathOf3rdPartyAssembly"); }
    return null;
}
于 2013-07-31T12:24:45.433 に答える