0

私のソリューションは、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();
        }
    }
}
4

2 に答える 2

0

これが私が問題を解決した方法です:

Company.Webで、Company.BLL.Fidoを拡張するクラスFidoを作成します。実装を提供せず、 Company.BLL.Fidoの代わりに Company.Web.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

**更新**

それまでの参照がない場合は、AppDomain に読み込まれたすべてCompany.BLLのアセンブリを確認する必要があります。必要なものを見つけるために名前などを調べなければならないので、面倒です。

しかし、このようなもの:

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 に答える