2012-07-31 4 views
5

メインプログラムが関数を呼び出すことができるクラスとして.txtファイルをロードする方法はありますか?私は基本的に私の単純なアプリにmodサポートを追加しようとしています。ここでは、各ファイルからオプションを選択できます。このファイルは、メインプログラムで呼び出されるボイド(関数)の束と同様の(しかし同じではない)形式に従います。C# - クラスとしてテキストファイルをロード

どうすればいいですか?それはプログラムの残りの部分と一緒に編集されないと考えて、私自身の質問に答えることはできますか?

ありがとうございます!

+0

これは可能ですが、C#コンパイラを呼び出す必要があります。あなたのmodがdllにコンパイルされるのを簡単にすることができます。そして、dllをロードして、リフレクションで呼び出すことができます。 – Blorgbeard

+0

おそらくRoslynを使用して調べる必要があります – Prescott

答えて

6

:基本的にCompile a C# Array at runtime and use it in code?

、あなたがたCodeDOMにあなたのテキストファイルを引き出し、それをコンパイルしたいと思います。その後、実行ヘルパーとしていくつかの動的メソッドを作成すると役立つでしょう。

  • は、任意のコンパイラ/構造エラー
  • との契約は、LINQの式を使用してヘルパーメソッドを作成したCodeDOM
  • に文字列としてファイルを読んでアップロードされたファイル
  • ファイルに、必要な検証を実行
  • を受信します新しいクラスと既存のコードの間のリンケージがコンパイルされたオブジェクトと橋渡しされるようにします(そうでなければ、リフレクションを使用してすべての新しいメソッドを呼び出す必要があります)

var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } }); 
var cp = new CompilerParameters() { 
    GenerateExecutable = false, 
    OutputAssembly = outputAssemblyName, 
    GenerateInMemory = true 
}; 

cp.ReferencedAssemblies.Add("mscorlib.dll"); 
cp.ReferencedAssemblies.Add("System.dll"); 

StringBuilder sb = new StringBuilder(); 

// The string can contain any valid c# code 

sb.Append("namespace Foo{"); 
sb.Append("using System;"); 
sb.Append("public static class MyClass{"); 
sb.Append("}}"); 

// "results" will usually contain very detailed error messages 
var results = csc.CompileAssemblyFromSource(cp, sb.ToString()); 

また、このトピックを参照してください:Implementing a scripting language in C#。 DLRのIronPythonがあなたのニーズに適しているかもしれません。

+0

それは事です - 私は必ずしもコンパイルする必要はありません、私はスクリプトとして実行する必要があります。 – Scott

+1

私は参照してください。参考までに、スクリプトはただちにコンパイルされます。パフォーマンス要件に応じて、動的コンパイルは適切ですが、C#コンパイルはフライ操作ではあまり最適化されていない可能性があります。 –

+0

これは本当に素晴らしいです、私はそれを追加します!ありがとうございました! – Scott

1

管理拡張フレームワークは、ちょうどあなたが

http://mef.codeplex.com/

マネージド拡張フレームワーク(MEF)を探しているされているもの

プラグインを処理フレームワークを使用して、組成物層であります大規模なアプリケーションの柔軟性、保守性、テスト容易性を向上させます。 MEFはサードパーティ製のプラグインの拡張性に使用できます。または、疎結合のプラグインのようなアーキテクチャの利点を通常のアプリケーションにもたらすことができます。

MEFは、アプリケーションのプラグインをサポートするための明確なアーキテクチャを提供します。

テキスト対DLL(ソースコード)

プラグイン開発者は、プラグインコードを含むDLLを提供することが期待されます。ただし、必要に応じて、ソースコードをRoslynを使用してDLLにコンパイルできます。プラグインソースコードの受信をサポートしたい場合は、ユーザーがコンパイラエラーを処理し、フレームワーク内のプラグインをデバッグするのを支援する必要があることにも留意してください。 DLLを提供するように要求する方が賢明かもしれません。

+1

これはクラスとして.txtファイルで動作しますか?私は彼が本質的にそれをコンパイルする必要があると思うだろう – Prescott

+0

@Prescott:そのポイントに対処するために私の答えを更新しました。 –

+0

これに関する更新はありますか? –

3

テキストファイルをロードし、コンパイル時のサービス(Microsoft's pre-release Roslyn projectまたはMono.CSharpのいずれか)を使用できます。次に、コンパイルされた出力を取り出してプログラムで実行することができます。

コンパイルされていないソースファイルではなく、コンパイルされたアセンブリを手に入れることが可能な場合は、Managed Extensibility FrameworkまたはMono.Addinsと考える必要があります。

2つ目のアプローチ(拡張アセンブリ)は、少なくとも次の2つの理由から私にとって優れているようです。1)ユーザーは、コードを正しくコンパイルしてから渡す前に、開発環境を使用できます。 )あなたは、入力を検証し、失敗を処理するための仕事が少なくなります。私はこの質問に答えてください

+0

ありがとうございます!私はRoslynをチェックします、それについて話すいくつかのコメントがあります。 – Scott

+2

モノラルを過小評価しないでください.CSharp - これはインターフェースが変わらないと期待できる「完成品」です。 Roslynのインターフェースは、おそらく現在のCTP状態と最終的なRTMの間で変わるでしょう。一旦出荷に近づくと、Roslynは典型的な.NETプロジェクトにとってはより適切な選択肢かもしれませんが、Monoアセンブリは他のアセンブリと同様にMicrosoftのCLRで動作することを忘れないでください。 – sblom

関連する問題