我正在尝试创建一个将一些资源列为静态字段的应用程序。我想从我的DLR脚本访问这些字段。但是,我注意到Dlr代码似乎与C#代码有不同的静态值。
下面是一个小型测试应用程序,用于演示此问题。
using Microsoft.Scripting.Hosting;
using System;
namespace SegmentTest {
public static class Dlr {
public static int MyFakeGlobalValue = 7;
static readonly ScriptScope _scope;
static Dlr() {
_scope = IronRuby.Ruby.CreateEngine().CreateScope();
var init = _scope.Engine.CreateScriptSourceFromString(@"
require 'SegmentTest'
include SegmentTest
");
init.Execute(_scope);
}
public static dynamic Execute(string script) {
return _scope.Engine.Execute(script, _scope);
}
}
class Program {
static void Main(string[] args) {
Dlr.MyFakeGlobalValue = 12;
Console.WriteLine(Dlr.MyFakeGlobalValue);
Console.WriteLine(Dlr.Execute("Dlr.MyFakeGlobalValue"));
Console.ReadKey();
}
}
}
第一个Console.WriteLine
显示MyFakeGlobalValue
为12.第二个调用显示值为7.显然,我的CLR类中对静态的更改与DLR代码不在同一个上下文中运行
在我的实际应用程序中,我有几个类调用Ruby代码,我希望我的Ruby代码能够创建这些类。但是,我最终遇到了某种嵌套上下文问题,其中Ruby脚本无法访问在早期上下文中创建的变量。
有没有办法让静态在应用程序和脚本中都相同?