私はこのような仕事のかなり多くを行っていると私は、ほぼすべての私はここからスタートするneeed情報のを得た:プラグインを使用して
http://www.codeproject.com/KB/cs/pluginsincsharp.aspx
私の最大のプロジェクトでは、オーディオ処理アプリでした。
一般的な考え方は次のとおりです。
あなたが配布、別々に必要なプラグインの種類ごとにインターフェイスを作成、DLLに署名しました。ここでは例のインタフェースは次のとおりです。
/// <summary>
/// Describes an audio reader.
/// </summary>
public interface IReader : IPlugin
{
/// <summary>
/// Fired by the reader to update the UI on long operations.
/// </summary>
event EventHandler<ProgressChangedEventArgs> ProgressChanged;
/// <summary>
/// Gets a list of of MIME types the reader supports.
/// </summary>
ReadOnlyCollection<string> TypesSupported { get; }
/// <summary>
/// Loads a SampleSet from the given input stream.
/// </summary>
/// <param name="inStream">The stream to read the</param>
/// <returns>A SampleSet read from the stream.</returns>
SampleSet Load(Stream inStream);
}
その後、あなたのプラグインのdllで、あなたがインターフェイスを持つクラスを実装します。
public sealed class WavReader : IReader
{
...
}
その後、あなたはリフレクションを使用してDLLをロード:
private void LoadPlugins(string applicationPath)
{
if (!Directory.Exists(applicationPath))
throw new ArgumentException("The path passed to LoadPlugins was not found.", "applicationPath");
List<IPluginFactory> factoriesList = new List<IPluginFactory>();
List<IReader> readersList = new List<IReader>();
foreach (string assemblyFilename in Directory.GetFiles(applicationPath, "*.plugin"))
{
Assembly moduleAssembly = Assembly.LoadFile(Path.GetFullPath(assemblyFilename));
foreach (Type type in moduleAssembly.GetTypes())
{
IPluginFactory instance = null;
if (type.GetInterface("IPluginFactory") != null)
instance = (IPluginFactory)Activator.CreateInstance(type);
if (instance != null)
{
factoriesList.Add(instance);
switch (instance.PluginType)
{
case PluginType.Reader:
readersList.Add((IReader)instance.Create());
break;
}
}
}
}
this.readers = readersList.AsReadOnly();
}
そして、 BAMにプラグインがあります!