我試過兩種stakx方法。
Method based on MainModule在某些特殊情況下不起作用(例如動態程序集)。
Method based on StackTrace可能會在層次結構中返回過高(或低)的程序集,如mscorlib。
我做了一點點變體在我的使用情況運行良好:
// 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;
基本上,我走棧,直到我找到一個名爲「主」與void
返回類型的常規方法。 如果找不到這樣的方法,我查找通過反射調用的方法。例如,NUnit使用該調用來加載單元測試。
當然,我這樣做只有當Assembly.GetEntryAssembly()
返回null
。