4

注: すべてのサンプル コードは大幅に簡略化されています。

次のように定義されたDLLがあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web;

namespace RIV.Module
{
    public interface IModule
    {
        StringWriter ProcessRequest(HttpContext context);
        string Decrypt(string interactive);
        string ExecutePlayerAction(object ParamObjectFromFlash);
        void LogEvent(object LoggingObjectFromFlash);
    }
}

これで、私のソリューションの外で、他の開発者が具体的なクラスを定義し、それらをアプリの BIN フォルダーにドロップできるようになりました。たぶん次のようなもの:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RIV.Module;

namespace RIV.Module.Greeting
{
    public class Module : IModule
    {
        public System.IO.StringWriter ProcessRequest(System.Web.HttpContext context)
        {
            //...
        }
        public string Decrypt(string interactive)
        {
            //...
        }
        public string ExecutePlayerAction(object ParamObjectFromFlash)
        {
            //...
        }
        public void LogEvent(object LoggingObjectFromFlash)
        {
            //...
        }
    }
}

さて、私のアプリでは、新しいモジュールが利用可能であることを知る必要があり (web.config またはそれらの行に沿って何かを推測しています)、データベースの Campaign テーブル (マップするもの) のトリガーに基づいてそれを呼び出すことができます。その特定のキャンペーンに使用するモジュールに)。

私はこの方法でインスタンス化しようとしています:

var type = typeof(RIV.Module.Greeting.Module);
var obj = (RIV.Module.Greeting.Module)Activator.CreateInstance(type);

ただし、参照がRIV.Module.Greeting.dllに設定されていないため、コンパイラはげっぷをします。

私は何を間違っていますか?

4

2 に答える 2

2

さらにリフレクションを使用する必要があります。

  • 呼び出してアセンブリをロードしますAssembly.Load
  • 電話someAssembly.GetType(name)または検索でタイプを見つけるsomeAssembly.GetTypes()
  • Typeインスタンスを渡すActivator.CreateInstance
  • インターフェイスにキャストします。
于 2011-02-09T00:42:57.727 に答える
1

typeof(RIV.Module.Greeting.Module) の代わりに、使用してみてください

var type = Type.GetType("RIV.Module.Greeting.Module, RIV.Module.Greeting");

(つまり、アセンブリ修飾名を文字列として指定して型を読み込みます)、IModule にキャストします。

このアプローチでは、モジュールの正確なクラスとアセンブリ名を知る必要があります (あなたが書いたように、それらは web.config に格納できます)。

または、完全に動的なプラグイン アプローチを使用することもできます。

  1. すべてのモジュール アセンブリに「RIV.Module.XYZ」という名前を付けるという規則を確立する
  2. bin ディレクトリをスキャンして一致する DLL を探します
  3. 各 DLL に対して、それをロードし (Assembly.Load など)、IModule を実装する型をスキャンします。
  4. 見つかったすべての型をインスタンス化し、IModule にキャストする
于 2011-02-09T00:46:24.667 に答える