我们目前正在研究如何将IronPython(脚本)嵌入到我们的C#应用程序中.
我们看到它将为我们的最终用户带来的好处,使他们能够加入我们的应用程序,但一个不断出现的问题是我们如何为最终用户提供能够识别我们不同的输入上下文的代码编辑能力应用.
我知道我们可以提供一个带语法高亮的简单文本编辑器,但是我们如何更进一步,允许用户针对我们从应用程序公开的对象测试他们的脚本.请记住,我们将根据入口点的上下文公开不同的对象.
您如何允许最终用户在您的应用程序中测试,编写和编辑脚本?
PS - 我是新来的,所以如果我做得不对,请告诉我!
我试图在运行时添加功能,类似于:
static void Main()
{
dynamic d = new Duck();
d.Quack =(Action) (() => Console.WriteLine("1")); //decalre a new method on runtime ??
d.Quack();
}
public class Duck : System.Dynamic.DynamicObject
{
//...
}
Run Code Online (Sandbox Code Playgroud)
'UserQuery.Duck'不包含'Quack'的定义
不动态应该允许我这样做吗?
全新ExpandoObject是唯一的解决方案吗?
我有我的鸭类已.我该如何制作Expando? - 我可以像鸭子一样做鸭子吗?
is运营商如何处理DLR?
为了使我的问题更加明确,请考虑以下签名:
public bool Is<T>(Func<dynamic> getInstance)
{
return getInstance() is T;
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,Is<T>返回需要什么条件true?此外,DLR是否提供任何机制来定制此行为?
我正在构建一个针对.NET的编译器,我以前直接生成了CIL,但生成DLR树将使我的生活更容易.我支持一些动态功能,即运行时函数创建和ducktyping,但绝大多数代码都是完全静态的.
所以现在已经解释过,我有以下问题:
任何对此的见解或对博客/代码/会谈的参考将不胜感激.
由于MS 似乎在服务器端(ASP.NET Futures)和客户端(Silverlight)的最新DLR中杀死了托管JavaScript,所以有人成功使用非过时的API来允许使用JScript.NET编写应用程序对象的脚本和/或可以解释如何这样做?Mono/JScript解决方案也可以接受,如果它稳定并满足下面的要求.
我们感兴趣的是将使用Microsoft JScript引擎和ActiveScript API的脚本宿主升级到具有更高性能和更易扩展性的东西.我们有超过16,000个服务器端脚本,重量超过42MB,因此重写为另一种脚本语言是不可能的.
我们的具体要求是:
mono automation dynamic-language-runtime jscript.net managed-jscript
我发现的关于DLR的大部分材料都与IronPython有关.你能用DLR解析和执行C#吗?如果是这样,那么会阻止您在拥有大约30个用户的Web服务器上尝试此操作吗?
更具体地说,我想在用户首次启动工作流时编写工作流对象的配置脚本.根据一年中变化的条件,工作流可能从不同的步骤开始,因此运行配置脚本似乎是处理变化的好方法.
我正在寻找一种动态添加成员动态对象的方法.好的,我想需要一点澄清......
当你这样做:
dynamic foo = new ExpandoObject();
foo.Bar = 42;
Run Code Online (Sandbox Code Playgroud)
该Bar属性将在运行时动态添加.但代码仍然"静态"引用Bar(名称"Bar"是硬编码的)...如果我想在运行时添加属性而不知道它在编译时的名称怎么办?
我知道如何使用类的方法使用自定义动态对象(我实际上是几个月前的博客)DynamicObject,但是如何使用任何动态对象?
我可以使用IDynamicMetaObjectProvider界面,但我不明白如何使用它.例如,我应该将哪个参数传递给GetMetaObject方法?(它期待一个Expression)
顺便说一句,你如何对动态对象进行反射?"定期"反思TypeDescriptor并不显示动态成员......
任何见解将不胜感激!
我想以这样一种方式托管动态语言运行时(DLR),以便在其中运行任意脚本的用户不能使该进程失效?
在DLR托管规范描述了如何举办DLR在一个单独的ApplicationDomain.这允许拆除和卸载脚本运行时并通过CAS限制某些操作(例如,我可以限制文件系统访问或禁止使用反射).
但有没有办法,例如: - 限制脚本使用的最大内存量? - 限制脚本创建的线程数? - 检测死锁脚本?
我认为使用为SQL Server开发的非托管.net托管API可以实现这种精细控制.这是方向吗?是否有这种通用.net沙盒的开源项目?
以下是我发现的一些可能有用的参考资料:
我想在利用DLR绑定机制的同时访问对象上的属性.
dynamicC#中的关键字),因为我在编译时不知道属性名称;IDictionary<string, object>我所知,转换为只解决了选择实现该接口的动态类的情况(例如ExpandoObject).这是演示代码:
static void Main(string[] args)
{
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Prop = "Value";
// C# dynamic binding.
Console.Out.WriteLine(obj.Prop);
// IDictionary<string, object>
Console.Out.WriteLine((obj as IDictionary<string, object>)["Prop"]);
// Attempt to use reflection.
PropertyInfo prop = obj.GetType().GetProperty("Prop");
Console.Out.WriteLine(prop.GetValue(obj, new object[] { }));
Console.In.ReadLine();
}
Run Code Online (Sandbox Code Playgroud) 我一直在玩ac#app,主持IronPython,IronRuby和(希望)PowerShell.由于IronPython和IronRuby完全基于DLR构建,因此使用它们的API几乎完全相同.
IronPython.Hosting.Python.CreateEngine()
Run Code Online (Sandbox Code Playgroud)
和
IronRuby.Ruby.CreateEngine()
Run Code Online (Sandbox Code Playgroud)
两者都创建Microsoft.Scripting.Hosting.ScriptEngine的实例.有没有希望强制PowerShell 3.0创建ScriptEngine?我没有找到很多关于这个主题的内容,除了PowerShell 3.0似乎比以前的版本更多地建立在DLR 上(参见http://huddledmasses.org/powershell-3-finally-on-the-dlr.
您似乎无法将使用以下内容创建的PowerShell引擎强制转换为ScriptEngine.
System.Management.Automation.PowerShell.Create()
Run Code Online (Sandbox Code Playgroud)
我怀疑,如果我真的想通过相同的API处理PowerShell,我需要创建自己的包装PowerShell主机的ScriptEngine.
c# ×5
.net ×3
dynamic ×3
.net-4.0 ×2
c#-4.0 ×2
ironpython ×2
automation ×1
cil ×1
ide ×1
ironruby ×1
jscript.net ×1
mono ×1
powershell ×1
reflection ×1
scripting ×1