我试图在运行时查找页面请求的程序集。我使用的代码为Get current System.Web.UI.Page from HttpContext?,适用于大多数呼叫,但存在问题。从当前上下文中查找页面或页面组合
如果在我的aspx.cs中,我实例化一个类变量,在我的类的顶部HttpContext.Current.CurrentHandler
为空。
例
我有一个名为Business.dll
与函数来获取页类型按照上述SO问题一个DLL。
在我的网页,在Default.asp的我FrontEnd.dll
有以下电话:
public partial class FrontEnd: Page
{
private readonly Type _t = Business.GetPageType();
上面的代码返回HttpContext.Current.CurrentHandler为空和返回HttpContext.Current.ApplicationInstance作为HttpApplication的类型,以及因此System.Web作为程序集。
如果我写的却是这样的:
public partial class FrontEnd: Page
{
readonly Type _t;
protected override void OnInit(EventArgs e)
{
_t = Business.GetPageType();
它工作得很好,我得到CurrentHandler和页面的引用。我当然可以重构所有地方并将变量初始化移动到OnInit,但这需要在应用程序中进行约定,并且需要更高程度的维护。
使用Assembly.GetEntryAssembly()
返回null为例,Assembly.GetExecutingAssembly()
返回Business.dll,所以我也不能使用它们。
是否有可能通过另一种方式来查找类型/ dll,可能使用请求Url来查找它来源的类型/ dll?
[更新]
到目前为止,我有这个代码,因为我所有的DLL都与已知的钥匙(不包括检查签名密钥的额外的方法)签署:
StackTrace stackTrace = new StackTrace();
StackFrame[] stackFrames = stackTrace.GetFrames();
Assembly firstAssembly = null;
foreach (StackFrame stackFrame in stackFrames)
{
var method = stackFrame.GetMethod();
Type t = method.DeclaringType;
if (t != null && t.Assembly.Is(SignedBy.Me))
{
firstAssembly = t.Assembly;
}
}
if(firstPzlAssembly != null)
{
return firstPzlAssembly;
}
虽然它的工作原理,它似乎是错误的,如果经常打电话会有潜在的性能影响。
这是有道理的。猜猜我可能必须选择重新编写代码并使用约定,您不能在类中自行初始化变量,但必须在OnInit或类似过程中执行。谢谢。 – 2012-02-06 13:46:57