35

.NETアプリケーションのスクリプトインターフェイスの設計と実装を開始するにはどうすればよいですか?

VSTA(.NETに相当するVBAfor )がありますCOMが、私が理解している限り、アプリケーションをインストールするたびにライセンス料を支払う必要があります。これはオープンソースのアプリケーションであるため、これは機能しません。

たとえば、インタプリタの埋め込み(IronPython?)もありますが、これによって「オブジェクトモデル」(以下を参照)を外部(または内部)スクリプトに公開する方法がわかりません。

サブ質問:

  • .NETのスクリプトインターフェイスストーリーとは何ですか?.NETでこれを行うのはどういうわけか簡単ですか?
  • たとえば、アプリケーション内の一部の.NETオブジェクトとそれに含まれるオブジェクトは、実行時に外部からアクセス可能であると宣言できますか?
  • 外部スクリプトはどのようにして(オブジェクトモデルを介して)アプリケーションにアクセスできますか?

バックグラウンド:

私はかつて、質量分析計(Mac OS、System 7 )からデータを取得および分析するためのMacintoshアプリケーション用のかなり複雑なスクリプトインターフェイスと、後でWindowsアプリケーション用のCOMインターフェイスを設計および実装しました。

どちらも「オブジェクトモデル」とクラス(プロパティを持つことができます)を使用して設計されました。これらはオーバーロードされた単語ですが、スクリプトインターフェイスのコンテキストでは、オブジェクトモデルは基本的に特定のクラスのオブジェクトの包含階層です。クラスには、プロパティ、含まれているオブジェクトのリストがあり、データであるだけでなく、動詞(アクション/メソッド)も含めることができます。たとえば、Macintoshの場合、定義されたアプリケーションオブジェクトには、機器で使用される電圧と動詞のプロパティを持つ取得オブジェクトを含めることができますfireLater。これらはすべて、外部スクリプトから見たものです。

どちらの場合も、アプリケーションの実装に使用されるプログラミング言語のクラス/オブジェクトは、スクリプトオブジェクトモデルとは何の関係もないことに注意してください。Macintoshの場合、スクリプトインターフェイスの実装に使用されるメカニズムはAppleによって定義されました。オブジェクトモデルの設計方法について、Appleによって定義されたいくつかの標準もありました。たとえば、クラス内の特定の一般的なプロパティの標準化された名前。

または、Microsoft Officeアプリケーションで公開されているCOMインターフェイスのように、アプリケーションオブジェクトを使用してドキュメントのリストに追加できます(ドキュメントのGUI表現を作成するという副作用があります)。

外部スクリプトは、コンテナ内に新しいオブジェクトを作成し、いつでも階層のコンテンツをナビゲートできます。Macintoshでは、ケーススクリプトはAppleScriptFrontierなどで記述できます。

Macintoshでは、スクリプトインターフェイスの実装は非常に複雑でした。MetroworksのC++クラスライブラリでのサポート(名前は今のところ私にはわかりません)により、はるかに簡単になりました。

4

8 に答える 8

13

PowerShellを見てください。

これにより、スクリプト可能な単純なコマンドレットをプログラムできます。また、階層型コンテナもサポートしています(デフォルトでは、ファイルシステム、レジストリ、証明書ストアなどがあります)。

于 2010-03-08T17:05:12.877 に答える
12

[編集:このコメントで詳しく説明されているように、スニペットや関数をホストしている場所で内部スクリプトを有効にする必要があると仮定すると、アプリをカスタマイズするための純粋な外部シナリオとは対照的に、人々がより厳格な事前定義ベースでアプリから何かを掘り出すことができるようにするためのファサード]

IronRubyとIronPythonは非常に優れており、これに適しています(ただし、他の回答が示すように、よりインフラストラクチャタイプのものがある場合はPowerShellが適切な場合があります)。

編集:内部スクリプトを有効にするための他のアイデアは

  • Windows Workflow Foundationを使用する(アクティビティを公開したり、ワークフローのインスタンスをホストしたりする)
  • Spring.NETの式言語を使用する(簡潔で、文書化と学習が簡単ですが、驚くほど強力です)

2011年6月2日編集:IronJSも適切な候補である可能性があり、Hanselminutesがそれについて語っています。

于 2010-03-24T13:53:42.660 に答える
7

スクリプトインターフェイスを実装するための戦略として、動的言語ランタイムを検討することをお勧めします。詳細:

DLRは現在IronPythonIronRubyをサポートしており、さらに他の多くの言語実装がCodePlexにあります。アプリケーションに固有の言語の作成に興味がある場合は、BitwiseMagazineに優れた入門記事があります。

DinoViehlandのPDC09セッション「動的言語を使用してスクリプト可能なアプリケーションを構築する」は一見の価値があります。デモコードはここにあります

于 2010-03-29T20:10:18.147 に答える
6

Luaスクリプト言語は無料で、多数の商用アプリケーションで使用されており、無料で利用できるLuaInterfaceライブラリを使用して.NETアプリケーションに簡単に埋め込むことができます。これにより、埋め込みインタープリターでスクリプトを作成するアプリケーションの型とメソッドを公開できます。活用できます。

LuaをC#アプリケーションに埋め込む方法のチュートリアルはここにあります。

編集:Luaは、埋め込まれたスクリプト言語としてゼロから設計されており、その結果、インタープリターは高度にカスタマイズ可能であることも注目に値します。ホストアプリケーションは、セキュリティモデルの一部として、解釈機能のほぼすべての側面を制限できます。たとえば、スクリプトがネットワーク接続を確立したり、ファイルに書き込んだりすることを許可または禁止します。

また、外部スクリプトについて質問しました。プログラムをアウトプロセススクリプトで利用できるようにすることは、プログラムをアウトプロセスアプリケーションで利用できるようにするのと同じ方法で行われます。つまり、ある種の通信プロトコルを介して標準化された自動化インターフェイスを公開します。Windowsでは、同じマシンのクロスプロセス通信の場合、これは最も一般的にはCOMですが、WCF、TCPリモート処理、RPC、またはその他の通信標準の場合もあります。何を選択するかは、アプリケーションの構築方法と、アプリケーションで実行する予定の外部自動化の種類に大きく依存します。

于 2010-03-31T00:18:28.753 に答える
5

無料で簡単に実装できる.NETスクリプト言語については、C#をご覧ください。

同様の質問に対する私の答えを参照してください。

データを公開することに関しては、それがどのように.NET言語であるかを確認するために、プログラムをアセンブリに追加して、関連するクラスにリンクして公開する必要があります。

于 2010-03-24T11:54:22.607 に答える
5

私はCS-Scriptを使用してあなたが望むようなものを作成しました。私の場合、アプリケーションでインターフェースを定義しました。次に、アプリケーションから実行できるように、このインターフェイスを実装するためのスクリプトが必要でした。私のアプリケーションはスキャンされた画像の処理に関するものだったので、私のインターフェースは次のようになりました。

public interface ICustomModule
{
    void ProcessBatch(IBatch batch)
}

このようにして、スクリプトはアプリケーションで定義したオブジェクトモデルにアクセスできます(私の場合はIBatchを使用)。良い点は、開発中にスクリプトに通常のクラスライブラリプロジェクトを使用できることです。IntelliSense、デバッグ...正確な詳細は覚えていませんが、基本的に、参照されたクラスを使用するようにアプリに指示するスイッチがアプリケーションにありました。スクリプトの代わりにライブラリ。

さらに、スクリプトを構成できる追加のインターフェイスを作成しました。スクリプトで一連のプロパティを定義し、アプリケーションによってプロパティグリッドに表示することができます。当時はもう少し柔軟に見えたので、ここでこのバージョンを使用したと思います。このようにして、ユーザーがスクリプトを構成できるようにするだけでなく、説明、選択肢、デフォルト値の形式でヘルプを提供することもできます...プロパティグリッドは非常に拡張可能です:あるケースでは、特別なものを表示するスクリプトがありましたいくつかの複雑な設定を定義するためのフォーム。

編集: もちろん、アプリケーションには「デバッグ」クラスライブラリへの参照がありませんでした。アセンブリをロードする必要があります...

于 2010-03-28T09:38:09.887 に答える
4

これでニーズが満たされるかどうかはわかりませんが、リフレクションを使用して、C#コードをコンパイルし、実行時に実行できます(コード例はこちら)。

したがって、たとえばでスクリプトを書くことができます。C#を実行してから、「オンザフライ」でコンパイルし、アプリケーションのコンテキストで直接実行します。もちろん、セキュリティ上の考慮事項を念頭に置く必要がありますが、スクリプトが信頼できる場合は、それが機能する可能性があり、スクリプトに強力な管理言語を使用する利点があります。

ただし、高性能が必要な場合や数千のスクリプトを実行する必要がある場合は、速度が遅すぎる可能性があります。

于 2010-03-24T11:46:17.070 に答える
3

私が作成したワークフローシステムの最後のスクリプトプラットフォームとしてCS-Scriptを実装しました。必要な各wrokflowには、さまざまなタスクをサブスクライブするユーザーと電子メールを受信するユーザーを決定するさまざまな条件がありました。スクリプトモデルを使用すると、ワークフローに新しいステップを導入し、それらのタスクに必要な固有の要件を処理することが容易になりました。

スクリプトモデルのもう1つの優れた副産物は、ワークフローをさまざまな条件下でテストでき、ワークフローの動作を完了するために反復的なアプローチをとることができることです。QAとユーザー受け入れテスト中に、問題をより簡単にハントできるように、スクリプトにログ機能を含めました。

CS-Scriptを使用すると、オブジェクトに完全にアクセスできます。つまり、スクリプトがアセンブリをインポートするときに、スクリプトコードでオブジェクトをインスタンス化できます。さらに、コンパイルされたスクリプトを保持し、それらにパラメーターを指定するだけで済みます。アセンブリがパラメータオブジェクトまたはディクショナリを使用している場合は、そのスクリプトを渡して、パラメータオブジェクトに含まれているオブジェクトに対してメソッドを実行できます。

于 2010-03-30T23:40:18.977 に答える