我目前正在使用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 DLR用于一个项目,但我发现它自2010年以来没有改变.有谁知道这个项目是否会被维护,或者它是否被其他任何东西取代了?如果微软不再支持DLR,我害怕开始一个严重依赖于DLR的项目.
使用动态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.Name 是 ItemGroup
dynamic xmlDoc …Run Code Online (Sandbox Code Playgroud) c# xml dynamic-language-runtime project-files visual-studio-2012
根据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() …
我有以下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 …
我正在尝试使用此签名为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#4.0中新的"动态"关键字有助于与动态.NET语言的交互,并且可以通过使用它而不是反射来帮助削减代码.因此,用途适用于非常具体的情况.
但是,我想知道的是,它是否会给C#带来其他动态语言(例如IronXXX语言)所带来的所有动态好处?换句话说,是否可以用动态语言风格在C#中编写整个应用程序?
如果有可能,是否会被推荐.为什么,或为什么不分别?
如果不换用另一种语言,我能获得动态语言的所有好处吗?
我有一个返回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).
这是什么东西应该工作?
我知道问题看起来是广泛和主观的,但我对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