2

私は VB 開発者ではありませんが、VB が部分的に使用されている大規模なプロジェクトを率いています。要件の 1 つは、動的に拡張可能なアプリケーション コアをサポートするプラグイン アーキテクチャを実装することです。

私たちの VB 開発者は、BLL を DLL に格納することが可能であると考えているようです。インターフェイスをすべて元のコア アプリケーションに保持し、拡張機能がインストールされるまで役に立たないようにします。

明らかに、これは理想的とは言えません。サブアプリケーション/コンポーネント全体を個別のDLLに保持して、コアプラットフォームにロードできるかどうかを知りたいですか???

何か案は?

4

1 に答える 1

3

これはまったく問題ありません。私のサンプル コードを見てください。別のdllに存在する抽象クラスは次のとおりです。

public abstract class ServerTask
{
    public int TaskId { get; set;}

    /// <summary>
    /// Gets description for ServerTask
    /// </summary>
    public abstract string Description { get; }


}

これはプラグイン実装のコードです:

public class SampleTask : GP.Solutions.WF.Entities.Tasks.ServerTask
{

    public override string Description
    {
        get 
        {
            return "Sample plugin";
        }
    }

}

最後に、プラグインをロードするコア アプリケーションからのコード:

    /// <summary>
    /// Loads Plugin from file
    /// </summary>
    /// <param name="fileName">Full path to file</param>
    /// <param name="lockFile">Lock loaded file or not</param>
    /// <returns></returns>
    static Entities.Tasks.ServerTask LoadServerTask(string fileName, bool lockFile, int taskId)
    {
        Assembly assembly = null;
        Entities.Tasks.ServerTask serverTask = null;
        if (lockFile)
        {
            assembly = System.Reflection.Assembly.LoadFile(fileName);
        }
        else
        {
            byte[] data = Services.Common.ReadBinaryFile(fileName);
            assembly = System.Reflection.Assembly.Load(data);
        }
        Type[] types = assembly.GetTypes();
        foreach (Type t in types)
        {
            if (t.IsSubclassOf(typeof(Entities.Tasks.ServerTask)))
            {
                serverTask = (Entities.Tasks.ServerTask)Activator.CreateInstance(t);
                serverTask.TaskId = taskId;
                break;
            }
        }
        if (serverTask == null)
        {
            throw new Exception("Unable to initialize to ServerTask type from library '" + fileName + "'!");
        }
        return serverTask;
    }

C# に慣れていない場合は、c# to vb.net オンライン コンバーターを使用してください。

ハッピーコーディングとよろしく!グレゴール・プリマー

于 2012-08-21T15:42:20.797 に答える