C# 如何在Microsoft.NET中使用Mono.CSharp解释器
我觉得Mono的编译器 编辑:我最初错过了,这解释了其中的一些原因(与Justin的答案一致) 我创建了一个简单的类来尝试使用它C# 如何在Microsoft.NET中使用Mono.CSharp解释器,c#,compiler-construction,mono,C#,Compiler Construction,Mono,我觉得Mono的编译器 编辑:我最初错过了,这解释了其中的一些原因(与Justin的答案一致) 我创建了一个简单的类来尝试使用它 [TestFixture] class Class1 { [Test] public void EXPR() { Evaluator.Run("using System;"); int sum = (int)Evaluator.Evaluate("1+2"); } } 以及Visual Studio
[TestFixture]
class Class1
{
[Test]
public void EXPR()
{
Evaluator.Run("using System;");
int sum = (int)Evaluator.Evaluate("1+2");
}
}
以及Visual Studio 2010中引用C:\Program Files(x86)\Mono-2.10.1\lib\Mono\4.0\Mono.CSharp.dll的项目
但是,当我尝试运行此任务时,会在计算器上引发以下异常。运行调用:
System.TypeInitializationException was unhandled by user code
Message=The type initializer for 'Mono.CSharp.Evaluator' threw an exception.
Source=Mono.CSharp
TypeName=Mono.CSharp.Evaluator
StackTrace:
at Mono.CSharp.Evaluator.Run(String statement)
at Experiments.Class1.EXPR() in W:\Experiments\Class1.cs:line 16
InnerException: System.TypeLoadException
Message=Method 'Mono.CSharp.Location.ToString()' is security transparent, but is a member of a security critical type.
Source=Mono.CSharp
TypeName=Mono.CSharp.Location.ToString()
StackTrace:
at Mono.CSharp.Evaluator..cctor()
InnerException:
谷歌证实了另一个人问这个问题,但没有回答。我试图开始阅读,但很快就被弄糊涂了。有人能建议一个快速的解决方法让我使用这个吗?并可能向我总结安全方面的影响(如果有的话)(在我的情况下-将来我希望用一个厚客户端应用程序包它,供内部和最终用户使用)它自年4月以来一直在.NET下工作 这点很小,但我注意到在
sum
的表达式中缺少分号
int sum=(int)Evaluator.Evaluate(“1+2;”)代码>
目前我只有Mono 2.11(来自git),它们已经改为使用多实例版本的编译器,而不是静态版本。因此,我的代码看起来有点不同:
using System;
using Mono.CSharp;
namespace REPLtest
{
class MainClass
{
public static void Main (string[] args)
{
var r = new Report (new ConsoleReportPrinter ());
var cmd = new CommandLineParser (r);
var settings = cmd.ParseArguments (args);
if (settings == null || r.Errors > 0)
Environment.Exit (1);
var evaluator = new Evaluator (settings, r);
evaluator.Run("using System;");
int sum = (int) evaluator.Evaluate("1+2;");
Console.WriteLine ("The sum of 1 + 2 is {0}", sum);
}
}
}
编辑:我想我应该确认我确实在.NET 4上成功地执行了此操作(在Windows XP上使用Visual C#Express 2010)
再次编辑:如果您有Visual Studio,您可以自己编辑它。源代码中包含一个.sln(解决方案文件),因此您可以在Windows上构建它,而无需Mono。生成的程序集将运行上面的代码。米格尔有一篇文章解释了新的Mono.CSharp
最终编辑:我上传了我实际使用的编译后的Mono.CSharp.dll程序集。将其作为编译上述代码的参考。我决定保留与问题类似的代码,但我不想覆盖我以前的答案:
下面的代码适用于Mono.CSharp的2.11版(包括用于使用Visual Studio/.NET构建的解决方案文件)。它是在WindowsXP上用.NET4测试的。我目前没有访问Mono 2.10的权限
[TestFixture]
class Class1
{
private Evaluator evaluator;
public Class1()
{
var report = new Report(new ConsoleReportPrinter());
evaluator = new Evaluator(new CompilerSettings(), report);
}
[Test]
public void EXPR()
{
evaluator.Run("using System;");
int sum = (int)evaluator.Evaluate("1+2;");
}
}
编辑:我上传了我实际使用的Mono.CSharp.dll程序集。将其作为编译上述代码的参考。看起来这是一个错误
.NET4放弃了但保留了的概念。简而言之,底层代码(如调用非托管代码)必须是“安全关键的”。应用程序级代码标记为“透明”。“透明”代码不能调用“安全关键”代码
如果您希望Mono 2.10代码与.NET 4一起使用,那么听起来像Mono.CSharp.Location.ToString()需要用[SecuritySafeCritical]属性进行标记。也许更好的办法是将所有Mono.CSharp标记为
抱歉,一个问题有多个答案。当我意识到2.11会起作用后,我对2.10的错误意味着什么更加好奇。我真的无法将这个答案与其他答案结合起来。David Ebbo还向NuGet发布了最新版本: