実際、私は私のソリューションの中で何らかの「静的にリンクされた」アセンブリを実装しようとしました。AssemblyResolveイベントの前に実行時にassembyをロードする方法はありますか?
- CopyLocalが= falseを
- .dllファイル自体への追加
- 「リンクとして追加」で私の解決策に.dllファイル自体を追加すると、私のアセンブリへの参照を追加:だから私は次のことを試してみました期待通りの手順は、私がしてFileNotFoundExceptionを得た後
private MyObject temp = new MyObject();
としてのForm1への私のアセンブリの外にいくつかのタイプを追加
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
{
Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
return MyAssembly;
};
でAssemblyResolveEvent内のアセンブリをロードしてみましょう! AssemblyResolveEvent内のリソースファイルからアセンブリをロードできます。しかし、このイベントは、他の場所で私のアセンブリが見つからない場合にのみ発生します。しかし、どうすれば私のアセンブリをロードすることができますの前に .Netは、さまざまな場所を検索しようとしますか?
Checking for Previously Referenced Assembliesの事実のため、私はドメインに事前にアセンブリをロードすることが可能であると考えていました。
は、私は次のメイン()メソッドstatic void Main()
{
LoadMyAssemblies();
AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadMyAssemblies();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static Assembly LoadMyAssemblies()
{
Assembly result = AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);
return result;
}
を使用してのProgram.cs内にこれを試してみました。しかし、それはまだResolveEventHandlerに実行されます。そして、はるかに良い、私はアセンブリを再度ロードして見てAppDomain.CurrentDomain.GetAssemblies()私のアセンブリが2回ロードされていることがわかります!
AssemblyResolveイベントの前にロードされたアセンブリがロードされたときに、ロードされたアセンブリが考慮されない理由は何ですか?デバッガの助けを借りて、私はAssemblyResolveからコールが来たときにnullを返しましたが、この場合、私は最初にFileNotFoundExceptionを取得しました。
ILMergeはすでにいくつかの状況で使用されていますが、この場合は「最良の」解決策ではありません。同じアセンブリがプログラムフォルダまたはGACにある場合、これは実行され、イベントはスローされないため、同じアセンブリを元の位置に戻すことも良い解決策ではありません。 – Oliver