.net が 2 つの異なるマシンでアセンブリを解決する方法の違いに気付きました。あるマシンでは行ごとに実行され、別のマシンではメソッドごとに実行されているようです。
に次のものがあるとしましょうTest.dll
:
public class Test()
{
static Test()
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == "Dep.dll")
{
return LocalMethodThatResolves(args); // local method in this class
}
else
{
return HelperInDependentAssembly.Resolve(args); // this method lives in Dep.dll
}
}
}
良いマシンで何が起こるか:
を解決するDep.dll
必要があるため、 に入り、ロジックCurrentDomain_AssemblyResolve
内で処理されるものとしてローカルに解決します。if
悪いマシンで何が起こるか:
解決するDep.dll
必要があるため、解決メソッドに入る前に、別のアセンブリ (同じDep.dll
) に存在するメソッドへの呼び出しがあることに気付き、最終的にはStackOverflowException
なぜそれが起こるのか誰か説明できますか?
(コードは .net 4.5 で実行されます)