通常の .NET 3.5 アプリケーションから Mono のコンパイラをサービスとして利用したいと考えています。
最新のビット (2.6.7) をダウンロードし、Visual Studio で簡単なコンソール アプリケーションを作成し、Mono.CSharp dll を参照しました。
次に、コンソール アプリで (オンラインのサンプルから直接):
Evaluator.Run("using System; using System.Linq;");
bool ress;
object res;
Evaluator.Evaluate(
"from x in System.IO.Directory.GetFiles (\"C:\\\") select x;",
out res, out ress);
foreach (var v in (IEnumerable)res)
{
Console.Write(v);
Console.Write(' ');
}
これにより、Evaluator.Run (最初の行) で例外がスローされます。
Illegal enum value: 2049.
Parameter name: access
これは、dll が csc.exe ではなく Mono.exe を使用してコンパイルされたためだと思います。
http://tirania.org/blog/archive/2010/Apr-27.htmlから直接 Mono.CSharp dll をdemo-repl.zip ファイルにダウンロードしようとしましたが、例外はスローされません。 ..ただし、Evaluator.Evaluate を呼び出した後の out パラメータ (res) は null です...そのため、何が問題なのかわかりません。例外はスローされません...
では、demo-repl.zip からダウンロードした dll が null を返す理由を突き止めたいと思います。
編集: null を返す理由がわかりました。何らかの理由でコンパイラが System.Linq 名前空間を取得していないようです...理由はわかりませんが... "System.IO.Directory.GetFiles (\"C:\\ ")"、それは正常に動作します。
更新: 参照されているシステム アセンブリを取得する Mono コンパイラに問題があるようです。csharp コンソール ツールのサンプルを直接コピーすると、次のようになります。
csharp> var list = new int [] {1,2,3};
csharp> var b = from x in list
> where x > 1
> select x;
csharp> b;
私は例外を受け取ります:
{interactive}(1,25): error CS1935: An implementation of `Select' query expressio
n pattern could not be found. Are you missing `System.Linq' using directive or `
System.Core.dll' assembly reference?
また、MCS を実際に実行可能なソリューションにするためには、評価呼び出しごとに 1 つのアセンブリを発行するのではなく、1 つの動的アセンブリに発行するようにコンパイラを変更する必要があります (そうしないと、重大なメモリ リークが発生し、以前に CSharpCodeProvider の形で扱ったことがあります)。これがどれほど難しいか、誰かが私を正しい方向に向けることができますか?
ありがとう。