あなたが説明しているものは、一般にプラグインシステムと呼ばれています。「C# を使用してプラグイン システムを作成する」のようなものをグーグルで検索すると、おそらく次のような多くの情報が得られます。
http://www.codeproject.com/Articles/4691/Plugin-Architecture-using-C
基本的な考え方は次のとおりです。
- プラグインがプログラムから情報を取得できるように、プログラムが実装するインターフェースを定義します。
- すべてのプラグインが実装するインターフェースを定義して、プログラムが何かを行うプラグインのメソッドを呼び出せるようにします。
- これらのインターフェイスを、プログラムとプラグイン dll によって参照される別の dll に入れます。
- OpenFileDialog など、プラグイン インターフェイスを実装するタイプの dll を見つける方法を提供します。
- dll をロードし、プラグイン インターフェイスを実装するタイプを見つけます (リフレクションを使用)。
- リフレクションを使用してこれらの型をインスタンス化します。
- 必要に応じて、インターフェイスを介してこれらの型のメソッドを呼び出します。
マネージド/ノンマネージドについて。マネージド DLL は、.net マネージド ランタイムを使用してビルド/コーディングされたものです。これは、 c#などの .net 言語でコーディングされたものです。
管理されていない dll は、多かれ少なかれ別の言語でコード化されたものです。
あなたが管理されていない dll と呼んだものは、動的に読み込まれる管理された dll と呼ばれます。つまり、これはまだマネージ dll (.net 言語でコード化されている) ですが、プログラムが実行されるまでロードされません。