私は動的に(mefを使用して)ロードするクラスを持っています。それらはある種のハンドラです(これらは正常に動作します)。
これらのハンドラーは (パケットを受信して 1 つを返すメソッドがあります) パケットを受け取ることができ、それらはすべて同じインターフェイス (たとえば IPacket としましょう) を実装し、応答 (IPacket も) を返します。
私はこれらのパケットを (tcp 接続を介して) 受信しましたが、私のプログラムは特定のクラスに精通していません (ただし、既知のインターフェイス - IPacket ですが、実装は異なります)。
そのため、(ハンドラーに渡すために) パケットを逆シリアル化しようとすると、例外が発生します。
- バイトにシリアル化し、オブジェクトに逆シリアル化します (バイナリ シリアライザーを使用) *
dll はアクセス可能なフォルダーに格納されているため、パケットの実装にアクセスできる唯一の方法は動的でなければなりません。
私は、プログラムをパケットに慣れさせるために Assembly.LoadFrom を使用するだけでよいと考えました。パケットをインスタンス化する必要さえなく、逆シリアル化 (インターフェイスのインスタンスを取得) してハンドラーに渡すだけです。その後、回答が返され、もう一度送信します。
しかし、それはうまくいきませんでした..
実行時にこれらの dll への参照を追加する方法を見つける必要があると仮定すると、私のプログラムはそれらを認識します.. (パック クラスで Export(typeof()..) を使用すると役立つと思います。それ?)
逆シリアル化しようとすると発生する例外は、クラス名が見つからないことです..
*トピックを編集しました。もう少し明確になることを願っています。ありがとう =]
- 編集:
これが mef で解決できると言っているわけではありません。それは間違いなくリフレクションで解決できます。実行時にプログラムに認識させたいすべてのクラスを含むフォルダーがあります。同じフォルダー内のdllへの参照を追加したかのように、実行時にクラスを「ロード」するだけです。
だから基本的に私がする必要があるのは:
特定のインターフェイス (この例では IPacket) のすべての実装をフォルダーから読み込みます。それらをインスタンス化する必要はありませんが、そのような型がプロジェクトにないという例外を取得せずに変数として受け取るだけです。
だから私はこのスニペットを見つけました:
static constructor() {
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
Assembly ayResult = null;
string sShortAssemblyName = args.Name.Split(',')[0];
Assembly[] ayAssemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly ayAssembly in ayAssemblies) {
if (sShortAssemblyName == ayAssembly.FullName.Split(',')[0]) {
ayResult = ayAssembly;
break;
}
}
return ayResult;
}
私が探しているものに近いようですが、実際にはこれを理解していません。特定のフォルダー内の dll のみをロードするようにこれを修正する方法はありますか? 私のプログラムはdllに慣れていますか?
また、コードの説明は大歓迎です。