我的解决方案包括 2 个项目,一个 ASP.NET MVC 3 项目 - Company.Web和一个 .NET 库项目 - Company.BLL。该库包含一个实现 IHTTP 的类——Company.BLL.Fido。
我已将 Fido 注册为我的 Web 项目的 HTTPHandler,并且在 ProcessRequest() 方法中,我想使用反射 从 Company.Web 项目动态调用一个方法—— Company.Web.FidoHelper.DoSomething() 。
如何获得对Company.Web程序集的引用?Assembly.GetCallingAssembly() 返回System.Web,Assembly.GetEntryAssembly() 返回null,Assembly.GetAssembly() 返回Company.BLL。
查看 AppDomain.GetAssemblies(),我看到Company.Web包含在结果中,但是我的库项目如何知道该选择哪一个?我无法对这个选择进行硬编码,因为我计划将此库用于其他项目。
代码:
namespace Company.BLL
{
public class Fido: IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//hard-coding like this is not acceptable
var assembly = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.FullName
.StartsWith("Company.Web"))
.FirstOrDefault();
var type = assembly.GetType("Company.Web.FidoHelper");
object appInstance = Activator.CreateInstance(type);
type.InvokeMember("DoSomething", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, appInstance, new object[] { context });
context.Response.End();
}
}
}