Próbowałem obu metod stakx.
Method based on MainModule nie działa w niektórych szczególnych przypadkach (na przykład dynamiczne złożenia).
Method based on StackTrace może przywrócić w hierarchii zbyt wysoki (lub niski) zbiór, taki jak mscorlib.
Zrobiłem trochę wariant, który działa dobrze w moich przypadkach zastosowanie:
// using System.Diagnostics;
// using System.Linq;
var methodFrames = new StackTrace().GetFrames().Select(t => t.GetMethod()).ToArray();
MethodBase entryMethod = null;
int firstInvokeMethod = 0;
for (int i = 0; i < methodFrames.Length; i++)
{
var method = methodFrames[i] as MethodInfo;
if (method == null)
continue;
if (method.Name == "Main" && method.ReturnType == typeof(void))
entryMethod = method;
else if (firstInvokeMethod == 0 && method.Name == "InvokeMethod" && method.IsStatic && method.DeclaringType == typeof(RuntimeMethodHandle))
firstInvokeMethod = i;
}
if (entryMethod == null)
entryMethod = firstInvokeMethod != 0 ? methodFrames[firstInvokeMethod - 1] : methodFrames.Last();
Assembly entryAssembly = entryMethod.Module.Assembly;
Zasadniczo chodzić stosu aż znajdę konwencjonalną metodę o nazwie „main” z void
typ zwracany. Jeśli taka metoda nie zostanie znaleziona, szukam metody wywoływanej przez odbicie. Na przykład NUnit używa tego wywołania do załadowania testów jednostkowych.
Oczywiście, robię to tylko wtedy, gdy Assembly.GetEntryAssembly()
zwraca null
.