私のソリューションは、ASP.NET MVC 3 プロジェクト - Company.Webと .NET ライブラリ プロジェクト - Company.BLLの 2 つのプロジェクトで構成されています。このライブラリには、IHTTP を実装するクラスCompany.BLL.Fidoが含まれています。
Web プロジェクトに Fido を 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();
}
}
}