0

我的解决方案包括 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();
        }
    }
}
4

2 回答 2

0

这是我解决问题的方法:

Company.Web中,创建一个扩展Company.BLL.Fido的类Fido。不要提供任何实现并将Company.Web.Fido注册为处理程序而不是Company.BLL.Fido

Company.BLL.Fido 的ProcessRequest() 方法中,HTTP 上下文的CurrentHandler属性现在引用Company.Web.Fido,因此我可以使用该类型获得对Company.Web程序集的引用。

var assembly = Assembly.GetAssembly(context.CurrentHandler.GetType()); 
//assembly = Company.Web

现在,我可以使用反射来调用 Company.Web.FidoHelper.DoSomething(context)。

代码:

namespace Company.BLL
{
    public class Fido: IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            //hard-coding like this is not acceptable
            var assembly = Assembly.GetAssembly(context.CurrentHandler.GetType());
            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();
        }
    }
}
于 2012-08-21T15:01:06.150 回答
0

用这个:

Assembly helperAssy = Assembly.GetAssembly(typeof(FidoHelper));

这是 MSDN 文档:http: //msdn.microsoft.com/en-us/library/system.reflection.assembly.getassembly%28v=vs.100%29.aspx

**更新**

好的,所以如果您没有参考,Company.BLL那么您将不得不检查 AppDomain 中加载的所有程序集。这会很混乱,因为您将不得不查看名称等才能找到您想要的东西。

但是这样的事情:

Assembly[] assemblies = AppDomain.Current.GetAssemblies();
Assembly theOne;
foreach(Assembly assy in assemblies)
{
   if(assy.FullName == "Company.Web")
   {
       theOne = assy;
       break;
   }
}
// Do the rest of your work
于 2012-08-21T13:59:11.763 回答