5

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

これどうやってするの?プログラムの残りの部分と一緒にコンパイルされないことを考えると、それは可能ですか?

ありがとう!

4

3 に答える 3

6

この質問への回答を参照してください:実行時に C# 配列をコンパイルし、コードで使用しますか?

基本的に、テキスト ファイルを CodeDom にプルしてコンパイルする必要があります。その後、実行ヘルパーとしていくつかの動的メソッドを作成すると役立つ可能性があります。

  • アップロードされたファイルを受け取る
  • ファイルに対して必要な検証を実行します
  • ファイルを文字列として CodeDom に読み込みます
  • コンパイラ/構造エラーに対処する
  • Linq 式ツリーまたは動的メソッドを使用してヘルパー メソッドを作成し、新しいクラスと既存のコードの間のリンクがコンパイル済みオブジェクトでブリッジされるようにします (そうしないと、すべての新しいメソッドをリフレクションを使用して呼び出す必要があります)。

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() );

このトピックも参照してください: C# でのスクリプト言語の実装. DLR を備えたIronPythonは、ニーズに適している場合があります。

于 2012-07-31T23:43:08.697 に答える
3

テキスト ファイルを読み込んでから、Compiler-as-a-service ( Microsoft のプレリリース Roslyn プロジェクトまたはMono.CSharpのいずれか) を使用できます。次に、コンパイルされた出力を取得して、プログラムで実行できます。

コンパイルされていないソース ファイルではなく、コンパイルされたアセンブリをユーザーに渡すことができる場合は、Managed Extensibility FrameworkまたはMono.Addinsを検討する必要があります。

2 番目のアプローチ (拡張アセンブリ) は、少なくとも次の 2 つの理由から私には優れているように思えます。入力を検証し、失敗を処理するために行う作業。

于 2012-07-31T23:41:38.527 に答える
1

プラグインを処理するフレームワークを使用する

Managed Extensibility Framework はまさにあなたが探しているものです

http://mef.codeplex.com/

Managed Extensibility Framework (MEF) は、大規模なアプリケーションの柔軟性、保守性、およびテスト容易性を向上させる .NET の構成レイヤーです。MEF は、サード パーティのプラグインの拡張性に使用することも、疎結合のプラグインのようなアーキテクチャの利点を通常のアプリケーションにもたらすこともできます。

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

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

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

于 2012-07-31T23:40:24.960 に答える