标签: dynamic-language-runtime

IronPython DLR; 将参数传递给编译代码?

我目前正在使用DLR创建和执行一个简单的python计算:

ScriptRuntime runtime = Python.CreateRuntime();
ScriptEngine engine = runtime.GetEngine("py");

MemoryStream ms = new MemoryStream();
runtime.IO.SetOutput(ms, new StreamWriter(ms));

ScriptSource ss = engine.CreateScriptSourceFromString("print 1+1", SourceCodeKind.InteractiveCode);

CompiledCode cc = ss.Compile();
cc.Execute();

int length = (int)ms.Length;
Byte[] bytes = new Byte[length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(bytes, 0, (int)ms.Length);
string result = Encoding.GetEncoding("utf-8").GetString(bytes, 0, (int)ms.Length);

Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

哪个打印'2'到控制台,但;

我想得到1 + 1的结果,而不必打印它(因为这似乎是一个昂贵的操作).我将cc.Execute()的结果赋值为null.有没有其他方法可以从Execute()获得结果变量?

我也试图找到一种传递参数的方法,即结果是arg1 + arg2并且不知道如何做到这一点; Execute唯一的其他重载将ScriptScope作为参数,我以前从未使用过python.有人可以帮忙吗?

[编辑]这两个问题的答案:( Desco被接受为指向正确的方向)

ScriptEngine py = Python.CreateEngine();
ScriptScope pys = py.CreateScope();

ScriptSource src = py.CreateScriptSourceFromString("a+b");
CompiledCode compiled = src.Compile();

pys.SetVariable("a", 1);
pys.SetVariable("b", 1);
var …
Run Code Online (Sandbox Code Playgroud)

.net c# ironpython dynamic-language-runtime

2
推荐指数
1
解决办法
1973
查看次数

DLR项目已经死了吗?

我正在考虑将.NET DLR用于一个项目,但我发现它自2010年以来没有改变.有谁知道这个项目是否会被维护,或者它是否被其他任何东西取代了?如果微软不再支持DLR,我害怕开始一个严重依赖于DLR的项目.

.net c# dynamic-language-runtime

2
推荐指数
1
解决办法
444
查看次数

将Visual Studio项目文件解析为XML

使用动态xml解析器,我正在尝试将VS Project文件作为XElement加载.这是项目文件的精简版:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
    </ItemGroup>
    <ItemGroup>
    </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

该文件似乎加载的意义是当我ToString()时,我得到了内容.但是,在尝试挑选元素时,找不到任何东西:

XElement element;

public DynamicXmlParser( string fileName )
{
    element = XElement.Load( fileName );
}

public override bool TryGetMember( GetMemberBinder binder, out object result )
{
    result = null;
    if ( element == null ) return false;

    XElement subElement = element.Element( binder.Name );

    if ( subElement == null ) return false;

    result = new DynamicXmlParser( subElement );
    return true;
}
Run Code Online (Sandbox Code Playgroud)

subElement始终为null.

binder.NameItemGroup

dynamic xmlDoc …
Run Code Online (Sandbox Code Playgroud)

c# xml dynamic-language-runtime project-files visual-studio-2012

2
推荐指数
1
解决办法
1496
查看次数

DynamicObject二进制操作的绑定行为因操作符和操作数而异

根据TryBinaryOperation的文档,当二进制操作的左侧是动态对象时,将调用此方法.

我有一个派生自动态对象的类,我发现并不总是如此.对于这个例子,我希望3次调用我的覆盖TryBinaryOperation但只得到2.

public class MyDynamic : DynamicObject
{
    public override bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result)
    {
        Console.WriteLine("operation = " + binder.Operation.ToString());
        result = arg;
        return true;
    }
}

class Program
{
    static void Main(string[] args)
    {           
        dynamic d = new MyDynamic();

        dynamic d1 = d + "add it";
        dynamic d2 = d + 1;
        dynamic d3 = d >> "shift it";

        Console.WriteLine("");

        Console.WriteLine(d1);
        Console.WriteLine(d2);
        Console.WriteLine(d3);
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,第一次调用返回字符串" DynamicRestProxy.UnitTests.MyDynamicadd it"; ie d.ToString() …

.net c# dynamic-language-runtime binary-operators

2
推荐指数
1
解决办法
254
查看次数

使用动态关键字从C#运行IronPython对象

我有以下IronPython代码.

class Hello:
    def __init__(self):
        pass
    def add(self, x, y):
        return (x+y)
Run Code Online (Sandbox Code Playgroud)

我可以使用以下C#代码来使用IronPython代码.

static void Main()
{

    string source = GetSourceCode("ipyth.py");
    Engine engine = new Engine(source);
    ObjectOperations ops = engine._engine.Operations;

    bool result = engine.Execute();
    if (!result)
    {
        Console.WriteLine("Executing Python code failed!");
    }
    else
    {
        object klass = engine._scope.GetVariable("Hello");
        object instance = ops.Invoke(klass);
        object method = ops.GetMember(instance, "add");
        int res = (int) ops.Invoke(method, 10, 20);
        Console.WriteLine(res);
    }

    Console.WriteLine("Press any key to exit.");
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

我可以使用动态DLR使这段代码更简单吗?

IronPython的行动中书有在<15.4.4动态对象进行交互的未来>关于它的简单的解释,但我无法找到一些例子.

添加

我附上程序的源/批处理文件. Program.cs …

c# ironpython dynamic-language-runtime

1
推荐指数
1
解决办法
2575
查看次数

如何将具有out参数的方法分配给ExpandoObject?

我正在尝试使用此签名为ExpandoObject分配方法(函数):

public List<string> CreateList(string input1, out bool processingStatus)
{
  //method code...
}
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的代码,下面的代码不能编译:

dynamic runtimeListMaker = new ExpandoObject();
runtimeListMaker.CreateList =
     new Func<string, bool, List<string>>(
           (input1, out processingStatus) =>
                {
                     var newList = new List<string>();

                     //processing code...

                     processingStatus = true;
                     return newList;
                });
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法更改CreateList签名,因为它会破坏向后兼容性,因此重写它不是一个选项.我试图通过使用委托解决这个问题,但在运行时,我得到了"无法调用非委托类型"异常.我想这意味着我没有正确分配代表.我需要帮助使语法正确(委托示例也可以).谢谢!!

c# dynamic-language-runtime expandoobject

1
推荐指数
1
解决办法
797
查看次数

"动态"关键字和DLR是否将C#作为动态类型语言提升为一等公民?

我知道C#4.0中新的"动态"关键字有助于与动态.NET语言的交互,并且可以通过使用它而不是反射来帮助削减代码.因此,用途适用于非常具体的情况.

但是,我想知道的是,它是否会给C#带来其他动态语言(例如IronXXX语言)所带来的所有动态好处?换句话说,是否可以用动态语言风格在C#中编写整个应用程序?

如果有可能,是否会被推荐.为什么,或为什么不分别?

如果不换用另一种语言,我能获得动态语言的所有好处吗?

dynamic-language-runtime c#-4.0

0
推荐指数
1
解决办法
280
查看次数

为什么我必须从动态输入类型参数中转换结果

我有一个返回double的简单动态对象:

class MyDynamic : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        result = 2.0;
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试调用一个接受int的方法:

    private static void SomeMethod(int number)
    {

    }
Run Code Online (Sandbox Code Playgroud)

然后,我打电话并将我的值传递给dynamic方法:

        dynamic x = new MyDynamic();
        SomeMethod(x.number);
Run Code Online (Sandbox Code Playgroud)

现在,这会导致异常,因为运行时抱怨它找不到相关的方法.这是预期的行为吗?我原本希望运行时自动将返回值强制转换为方法请求的类型(在本例中为int).

这是什么东西应该工作?

.net c# dynamic-language-runtime

0
推荐指数
1
解决办法
111
查看次数

意思是什么 - "IronPython是Python编程语言的一种实现"

我知道问题看起来是广泛和主观的,但我对IronPython的这个定义无处不在 - " IronPython是Python编程语言的实现 "如果有任何SO帖子准确回答这个问题,请随意将其标记为重复.

到目前为止,我对此的理解是:

1)Iron python只是用C#编写的托管库(IronPython.dll)并使用CLR

2)Iron python托管代码在内部使用标准Python库(作为Iron Python的一部分安装)来使用DLR弥补差距.

这里的任何python代码的实际执行运行时间是多少?是Python解释器吗?这个解释器是否在不同的进程中运行?

3)IronPython.dll公开api以与任何其他.net语言集成python代码.

我确信某些地方我的理解是不正确的 - " IronPython是Python编程语言的一种实现 "因为从这看起来像Python语言是一种契约,它规定了你如何编写检查条件if condition和实现者如铁python照顾将其转换为IL代码.是这样的吗?

感谢任何帮助或指针.

c# python ironpython dynamic-language-runtime language-design

0
推荐指数
1
解决办法
341
查看次数