2

我正在尝试使用 Script# 编译器将 C# 的小片​​段编译成 JavaScript。

但是我没有得到任何回报,因为GetStream()MemoryStreamSource什至没有被召唤,所以我一定做错了什么。

这是我的代码:

CodeScriptCompiler csc = new CodeScriptCompiler();

return csc.CompileCSharp("String.IsNullOrWhiteSpace(Model.MobilePhoneNumber)");

CodeScriptCompiler.cs

using System;
using System.Collections.Generic;
using ScriptSharp;

namespace CodeToScriptCompiler
{
    public class CodeScriptCompiler
    {
        ScriptCompiler sc = new ScriptCompiler();

        public string CompileCSharp(string csharpCode)
        {
            string errorMessages = String.Empty;

            CompilerOptions options = new CompilerOptions();
            options.Defines = new List<string>();
            options.References = new List<string>();
            options.References.Add("System.dll");
            options.Resources = new List<IStreamSource>();
            options.Sources = new List<IStreamSource>();
            options.Sources.Add(new MemoryStreamSource(csharpCode));
            options.TemplateFile = new MemoryStreamSource(csharpCode);

            MemoryStreamDestination output = new MemoryStreamDestination();
            options.ScriptFile = output;

            if (!options.Validate(out errorMessages))
            {
                return errorMessages;
            }

            return output.GetCompiledCode();
        }
    }
}

MemoryStreamSource.cs

using System.IO;
using System.Text;
using ScriptSharp;

namespace CodeToScriptCompiler
{
    public class MemoryStreamSource : IStreamSource
    {
        private string _code;

        private MemoryStream _memoryStream;

        public MemoryStreamSource(string code)
        {
            this._code = code;
        }

        public string Name
        {
            get { return "InMemoryCode"; }
        }

        public string FullName
        {
            get { return "InMemoryCode"; }
        }

        public void CloseStream(Stream stream)
        {
            stream.Close();
        }

        public Stream GetStream()
        {
            this._memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(this._code));

            return this._memoryStream;
        }
    }
}

MemoryStreamDestination.cs

using System;
using System.IO;
using ScriptSharp;

namespace CodeToScriptCompiler
{
    public class MemoryStreamDestination : IStreamSource
    {
        private MemoryStream _memoryStream;

        private string _compiledCode;

        public string Name
        {
            get { return "MemoryStreamDestination"; }
        }

        public string FullName
        {
            get { return "MemoryStreamDestination"; }
        }

        public void CloseStream(Stream stream)
        {
            if (String.IsNullOrWhiteSpace(this._compiledCode))
            {
                this._compiledCode = this.GetCompiledCode();
            }

            stream.Close();
        }

        public Stream GetStream()
        {
            this._memoryStream = new MemoryStream();

            return this._memoryStream;
        }

        public string GetCompiledCode()
        {
            if (!String.IsNullOrWhiteSpace(this._compiledCode))
            {
                return this._compiledCode;
            }

            if (this._memoryStream != null)
            {
                using (StreamReader sr = new StreamReader(this._memoryStream))
                {
                    return sr.ReadToEnd();
                }
            }

            return String.Empty;
        }
    }
}
4

1 回答 1

2

我认为有些事情可能存在问题。

  1. TemplateFile 设置为ac#码流。不要设置它,因为那不是一个有效的模板。
  2. 引用应包括 script# mscorlib,此外,仅包含有效 script# 程序集的完整路径。System.dll 不是脚本# 程序集。
  3. 在从 MemoryStream 读取之前,需要将流位置设置回开始,否则编译器写入后它在结束,没有更多可读取的内容。
  4. 在您创建的编译器实例上没有看到对编译的调用,传入选项实例。我的猜测是您确实这样做了,只是堆栈溢出片段中没有。

您可能还应该实现 IErrorHandler 并将其传递给编译器以在它们发生时获取错误消息,一旦您有基本的东西工作。

作为参考,您还可以查看https://github.com/nikhilk/scriptsharp/tree/master/tests/ScriptSharp/Core上的单元测试,它执行类似的操作。

请注意,您需要一个有效的 c# 源文件,而不是一个独立的表达式。但是,您可以通过从结果脚本的开头和结尾剥离内容来处理该问题,以获取您关心的表达式的脚本。

希望有帮助。

我当然有兴趣/好奇了解您如何使用它,以及您在哪里编译 c# 以动态编写脚本......

于 2012-09-06T14:05:42.200 回答