ASP.NET で CMS を開発しています。私たちはアドオンのアイデアを気に入っており (Wordpress のように、開発者なら誰でもメニュー ボタンやウィジェットを追加できる)、開発者が私たちのシステムで同じことをできるようにしたいと考えています。
ただ、C#がコンパイル言語であることがアドオンの邪魔になると思います。
私は正しいですか?または、ASP.NET アプリケーション用のアドオンを作成する方法はありますか?
C# がコンパイル済み言語であるという事実は、まったく問題ではありません。実際、.NET フレームワークでは、他のコードを比較的簡単にロードできるはずです (Java と同じ理由で)。Managed Extensibility Frameworkを調べてください。これは、マネージ コードでのアドオンの読み込みに関するものです。
それはまったく障害ではありません。MEFは既に言及されていますが、次のものも使用できます。
特に ASP.NET についてはわかりませんが、私が知っている唯一のコンパイル済みプログラミング言語 (Objective-C/Cocoa) には、動的にロードできるバンドルの概念があります。それがバックエンドでどのように機能するかはわかりませんが、C#/ASP.NET にも同様のシステムがあると思います。
Wordpress での方法はわかりませんが、方法はたくさんあるはずです。開発者がコンパイル済みコードを使用してアセンブリをアップロードできるようにするか、C# や IronPython、またはそれをサポートして動的にコンパイルできるコードをアップロードできるようにすることができます。おそらく、タスクにWebPartsを使用できます。
Microsoft は、特にこの問題のためにManaged Extensibility Framework (MEF)を作成しました: .NET アプリケーション用の .NET プラグインを提供します。これは、(将来のバージョンの) Visual Studio がマネージド プラグインを作成するために使用するフレームワークです。
ただし、これには動的スクリプト言語の使用を検討してください。このような問題は、まさにそのために特別に設計されたものです。アプリケーションで動的言語ランタイムをホストする場合、ユーザーはアプリケーションをスクリプト言語で拡張できるだけでなく、DLR 実装が存在する任意の動的言語 (スクリプトまたはその他) でさえも拡張できることを意味します: Ruby 、Python、Smalltalk、スキーム、JavaScript、PHP、名前を付けます。最大の欠点は、DLR がまだリリースされていないことです。
C# では、任意のアセンブリを作成し、それらを DLL ファイルとしてリンクしてから、必要なことを行うことができます。
通常のケースは、すべてのプラグインによって実装されなければならないプラグイン インターフェイスの種類を定義することです。
次に、ファイルシステムからすべてのプラグインをロードし (プラグイン DLL を反復処理することによって)、インターフェイスを実装するクラスを内部で見つけ、インスタンス化し、操作します。
プラグインにアンロード可能性とセキュリティを提供したい場合は、アプリケーション ドメインを作成してそこにプラグインをロードすると、複雑さが増しますが、安定性も向上します (不適切なプラグインがアプリをクラッシュさせることはありません)。
具体的な回答が必要な場合は、より具体的に質問してください:-)
フックを所定の位置に配置することはそれほど難しくありません。アドオン機能が表示される場所を事前に定義する必要があります。たとえば、メニューを描画するときに、リフレクションを使用して、「BuildMenu」関数の他の dll (特定の名前と場所を持つ) を検索できます。この関数シグネチャの API を定義します。基本メニュー項目コレクションに追加する項目のリストを返さなければならない場合があります。