0

私は、各ゲームに独自のプラグインクラスとして(依存性注入を介して)ロードするボードゲームフレームワークを作成しようとしています。各「ゲーム」は、それ自体のDLLになります。したがって、プラグインは、ゲームの「ポーン」の正しいリソース、ゲームボードの適切な画像、ゲームに必要な特別なロジックなどの読み込みを処理します。

私が提案するフォルダ構造は

game.exe
plugins/
    /plugin1
        /textures
        plugin1.dll

    /plugin2
        /textures
        plugin2.dll

ゲームを開始するときに、ファイルマネージャーを使用して適切なdllをロードしてもらいます(将来的に改良されます)。他のクライアントが接続すると、プラグインもロードされます。そのゲームのdllもありません。

ロードするためのコードの例を以下に示します。

Assembly assembly = Assembly.LoadFile(openPlugin.FileName);

string fullTypeName = "TestPlugin.TestPlugin";
Type dllType = assembly.GetType(fullTypeName);
IPlugin myType = (IPlugin)Activator.CreateInstance(dllType);

今のところ、タイプ名にハードコードされた文字列を使用していますが、最終的には変更されます。

他の人と遊ぶために、主にオブジェクトのバイナリシリアル化を使用することで構成されるネットワークアーキテクチャがあります。問題は、プラグインdllにあったクラスのオブジェクトを逆シリアル化すると、システムがファイルからdllをリロードしようとすることです。それをリロードしようとすると、通常のルールに従い、exeのディレクトリでdllを探します(これは、プラグインdllをメインディレクトリに移動した場合にすべて機能します)。

これが役立つ場合のバイナリシリアル化のサンプルです

public Stream SerializeObject(object obj)
{
    Stream stream = new MemoryStream();

    BinaryFormatter formatter = new BinaryFormatter();

    formatter.Serialize(stream, obj);

    return stream;
}

/// <summary>
/// Deserializes Objects
/// </summary>
/// <param name="stream">Stream containing the binary objects</param>
public T DeserializeObject<T>(byte[] data)
{
    Stream stream = new MemoryStream(data);
    IRemotingFormatter formatter = new BinaryFormatter();

    return (T)formatter.Deserialize(stream);
}

オープンエンドを少なくしたいのですが、これを解決して必要なディレクトリ構造を維持するにはどうすればよいですか?-プラグインを再帰的に検索するためのカスタムローダーの形式を作成します/?-バイナリシリアル化に別の方法を選択しますか?-「ロード」すると、クラスが将来の使用のために「メモリ」にロードされるため、適切に実行されていませんか?

これを読んで「なぜ彼はそのようにやっているのですか??」:)

4

1 に答える 1

0

1)Assembly assembly = Assembly.LoadFrom("dllPath");代わりに使用するAssembly.LoadFile()

2)プラグインの名前は異なるため、プラグインを1つのディレクトリに配置し、app.configでこのディレクトリへのパスを定義できます。

3)メインのAppDomain以外にDLLをロードして、アプリケーションを再起動せずにDLLをアンロードできるようにすることをお勧めします。ここで、私の例を参照してください。

于 2012-12-19T23:39:42.163 に答える