.txt ファイルをクラスとしてロードし、メイン プログラムから関数を呼び出す方法はありますか? 私は基本的に、ユーザーが各ファイルからオプションを選択できるシンプルなアプリに mod サポートを追加しようとしています。このファイルは、メイン プログラムで呼び出される多数のボイド (関数) を含む、同様の (ただし同じではない) 形式に従います。
これどうやってするの?プログラムの残りの部分と一緒にコンパイルされないことを考えると、それは可能ですか?
ありがとう!
.txt ファイルをクラスとしてロードし、メイン プログラムから関数を呼び出す方法はありますか? 私は基本的に、ユーザーが各ファイルからオプションを選択できるシンプルなアプリに mod サポートを追加しようとしています。このファイルは、メイン プログラムで呼び出される多数のボイド (関数) を含む、同様の (ただし同じではない) 形式に従います。
これどうやってするの?プログラムの残りの部分と一緒にコンパイルされないことを考えると、それは可能ですか?
ありがとう!
この質問への回答を参照してください:実行時に C# 配列をコンパイルし、コードで使用しますか?
基本的に、テキスト ファイルを 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() );
このトピックも参照してください: C# でのスクリプト言語の実装. DLR を備えたIronPythonは、ニーズに適している場合があります。
テキスト ファイルを読み込んでから、Compiler-as-a-service ( Microsoft のプレリリース Roslyn プロジェクトまたはMono.CSharpのいずれか) を使用できます。次に、コンパイルされた出力を取得して、プログラムで実行できます。
コンパイルされていないソース ファイルではなく、コンパイルされたアセンブリをユーザーに渡すことができる場合は、Managed Extensibility FrameworkまたはMono.Addinsを検討する必要があります。
2 番目のアプローチ (拡張アセンブリ) は、少なくとも次の 2 つの理由から私には優れているように思えます。入力を検証し、失敗を処理するために行う作業。
プラグインを処理するフレームワークを使用する
Managed Extensibility Framework はまさにあなたが探しているものです
Managed Extensibility Framework (MEF) は、大規模なアプリケーションの柔軟性、保守性、およびテスト容易性を向上させる .NET の構成レイヤーです。MEF は、サード パーティのプラグインの拡張性に使用することも、疎結合のプラグインのようなアーキテクチャの利点を通常のアプリケーションにもたらすこともできます。
MEF は、アプリケーションでプラグインをサポートするための明確に定義されたアーキテクチャを提供します。
DLL とテキスト (ソース コード)
プラグイン開発者は、プラグイン コードを含む DLL を提供する必要があります。ただし、必要に応じて、Roslynを使用してソース コードを DLL にコンパイルできます。プラグインのソース コードの受信をサポートしたい場合は、ユーザーがコンパイラ エラーに対処し、フレームワーク内でプラグインをデバッグできるようにするためのサポートも提供する必要があることに注意してください。DLL の提供を要求する方が賢明かもしれません。