使用脚本#编译代码(单机)(Use Script# to compile code (stand-a

2019-09-22 05:04发布

我试图使用脚本#编译器的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;
        }
    }
}

Answer 1:

有些事情,我看到潜在的问题。

  1. TemplateFile设置为C#代码流。 设置就可以了,因为这不是一个有效的模板。
  2. 参考文献应包括脚本#mscorlib程序,此外,唯一的全路径,以有效的脚本#组件。 System.dll中并不是脚本#组装。
  3. 您可以先在MemoryStream的阅读,你需要设置流位置回到开始,否则它是在编译器写入的结束以后,并没有什么更多的阅读。
  4. 没有看到调用编译您创建的编译器实例,传递选项实例。 我的猜测是你没有做到这一点,就没有这样的堆栈溢出片段。

你或许还应该实现IErrorHandler并传递到编译器来获得他们应该出现的错误信息,一旦你有基本的东西的工作。

仅供参考,你也可以看看在单元测试https://github.com/nikhilk/scriptsharp/tree/master/tests/ScriptSharp/Core该做类似的事情。

请注意,您需要一个有效的C#源文件,而不是单一的独立表达。 但是,您可以通过很可能从一开始就和生成的脚本结束剥离的东西拿到剧本只是你所关心的表达与处理。

希望帮助。

我当然有兴趣/好奇地了解您如何使用这一点,在那里你编译C#编写脚本动态...



文章来源: Use Script# to compile code (stand-alone)