Assembly.GetEntryAssembly()无法在Web应用程序中使用。
但是... 我确实需要类似的功能。 我正在使用一些嵌套很深的代码,这些代码既可以在Web应用程序中使用,也可以在非Web应用程序中使用。
我目前的解决方案是浏览堆栈跟踪以查找第一个调用的程序集。
/// <summary>
/// Version of 'GetEntryAssembly' that works with web applications
/// </summary>
/// <returns>The entry assembly, or the first called assembly in a web application</returns>
public static Assembly GetEntyAssembly()
{
// get the entry assembly
var result = Assembly.GetEntryAssembly();
// if none (ex: web application)
if (result == null)
{
// current method
MethodBase methodCurrent = null;
// number of frames to skip
int framestoSkip = 1;
// loop until we cannot got further in the stacktrace
do
{
// get the stack frame, skipping the given number of frames
StackFrame stackFrame = new StackFrame(framestoSkip);
// get the method
methodCurrent = stackFrame.GetMethod();
// if found
if ((methodCurrent != null)
// and if that method is not excluded from the stack trace
&& (methodCurrent.GetAttribute<ExcludeFromStackTraceAttribute>(false) == null))
{
// get its type
var typeCurrent = methodCurrent.DeclaringType;
// if valid
if (typeCurrent != typeof (RuntimeMethodHandle))
{
// get its assembly
var assembly = typeCurrent.Assembly;
// if valid
if (!assembly.GlobalAssemblyCache
&& !assembly.IsDynamic
&& (assembly.GetAttribute<System.CodeDom.Compiler.GeneratedCodeAttribute>() == null))
{
// then we found a valid assembly, get it as a candidate
result = assembly;
}
}
}
// increase number of frames to skip
framestoSkip++;
} // while we have a working method
while (methodCurrent != null);
}
return result;
}
为确保程序集符合我们的要求,我们有以下三个条件:
- 程序集不在GAC中
- 程序集不是动态的
- 程序集没有被生成(以避免临时的ASP.NET文件)
现在我正在寻找以下信息:
1)我的程序集验证条件是否足够?(我可能忘记了一些情况)
2)是否有一种方法可以从ASP.Net临时文件夹中的某个代码生成的程序集中获取有关包含该页面/视图的项目的信息?(我认为不行,但谁知道呢……)
ExcludeFromStackTraceAttribute
是你的一个类吗?我在 BCL 中找不到它。同样的问题也出现在GetAttribute<>
上,这是你为了方便而创建的方法吗? - quentin-starin