问题标签 [dynamic-language-runtime]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ironpython - IronPython 内存泄漏?
运行这个:
看起来正在创建的列表对象永远不会被标记为垃圾收集。从内存分析器看来,解释器的堆栈帧似乎持有所有列表对象,因此 GC 永远无法对此做任何事情。
这是设计使然吗?
编辑:
这是一个更好的问题示例。使用内存分析器运行以下代码:
您将看到在列表推导期间分配的内存永远不会被垃圾收集。这是因为创建的所有对象都被 DLR 中的 InterpreterFrame 对象引用。
现在运行这个:
在分析器下,您可以看到这里的内存确实得到了垃圾收集。我猜这是可行的,因为函数的 InterpreterFrame 在函数退出时被清除。
那么,这是一个错误吗?这似乎会在 IronPython 脚本的框架(上下文?)内导致一些非常糟糕的内存泄漏。
wcf - 使用动态语言和 DLR 创建 WCF 服务
我很好奇任何人将如何使用 IronPython 或 IronRuby 等动态语言创建基于 WCF 的服务。这些语言没有接口的概念。有人会如何定义服务合同?我们是否需要依赖静态语言来完成此类任务?我尤其是 Python 的忠实粉丝,我想知道此时是否可以做到这一点。
dynamic - .NET 4.0 静态使用的动态对象?
我在这里问了另一个相关的问题:将动态转换为静态问题
我已经厌倦了 .NET 中的 XML 配置文件,并希望用更合理的格式替换它们。因此,我正在为 C# 应用程序编写一个配置文件解析器,它将采用自定义配置文件格式,解析它,并创建一个 Python 源字符串,然后我可以在 C# 中执行并用作static
对象(是的,这是正确的——我最后想要一个static
(不是静态类型的动态)对象)。
这是我的配置文件的示例:
使用ANTLR,我创建了一个 Lexer/Parser,它将这种格式转换为 Python 脚本。所以假设我没有问题,并且可以使用上面的 .config 并在其上运行我的 Lexer/Parser 以获取 Python 脚本(这具有为我的配置提供验证工具的额外好处)。通过在 C# 中运行生成的脚本
我可以获得一个dynamic
具有我的配置设置的对象。我现在可以通过在该对象上调用动态方法来获取 C# 中的配置文件设置:
当然,我这里没有类型安全,也没有智能感知支持。我有dynamic
我的配置文件的表示,但我想要一个静态的。我知道我的 Python 对象的类型是什么——它实际上是在 C# 类的实例中更新的。但由于它发生在 python 中,它的类型不是 C# 类型,dynamic
而是。然后我想要做的是将对象转换回我知道该对象是的 C# 类型:
有没有办法弄清楚如何将对象转换为静态类型?我相当怀疑是否存在……如此怀疑以至于我采取了另一种我不完全确定的方法。我想知道是否有人有更好的方法...
所以这是我目前的策略:因为我知道 python 对象的类型,所以我正在创建一个 C# 包装类:
dynamic
在ctor中接受一个对象:
现在我有了对我知道其类型的 Python 动态对象的引用。所以我可以在我知道的 Python 方法周围放置包装器:
现在动态对象是通过这个静态代理访问的,因此显然可以通过接口等在静态 C# 世界中传递:
这个解决方案具有我们所知道和喜爱的所有静态类型的好处,同时也让我可以选择“拯救”到动态:
但是,伙计,这似乎是获取静态类型对象的一种相当复杂的方式!由于整个动态/静态交互世界对我来说是新的,我真的在质疑我的解决方案是否是最佳的,或者我是否遗漏了一些关于如何桥接的东西(即某种将动态对象转换为已知静态类型的方法)这两个宇宙之间的鸿沟。
c# - C# 4.0:将动态转换为静态
这是一个分支问题,与我在这里问的另一个问题有关。我把它分开是因为它真的是一个子问题:
我很难将一个类型的对象转换dynamic
为另一个(已知的)静态类型。
我有一个执行此操作的 ironPython 脚本:
请注意,它只是新建一个 BCL System.Uri 类型并返回它。所以我知道返回对象的静态类型。
现在在 C# 领域,我正在更新托管内容的脚本并调用这个 getter 来返回 Uri 对象:
工作没问题。我现在可以使用强类型 Uri 对象,就好像它最初是静态实例化的一样。
然而....
现在我想定义我自己的 C# 类,就像我对 Uri 所做的那样,它将在动态领域中更新。我的简单 C# 类:
现在在 Python 中,新建一个这种类型的对象并返回它:
然后在 C# 中调用 getter:
在这里,演员表不起作用。请注意,“测试”对象(动态)是有效的——我可以调用 DoSomething()——它只是不会转换为已知的静态类型
所以我很困惑。BCL 类型 System.Uri 将从动态类型转换为正确的静态类型,但我自己的类型不会。显然有一些我不明白的事情......
--
更新:我做了一堆测试以确保我的程序集引用都正确排列。我更改了引用的程序集版本号,然后查看了dynamic
C# 中的对象 GetType() 信息——它是正确的版本号,但它仍然不会转换回已知的静态类型。
然后我在我的控制台应用程序中创建了另一个类来检查我是否会得到相同的结果,结果是肯定的:我可以dynamic
在 C# 中获得对在我的 Python 脚本中实例化的静态类型的引用,但它不会转换回正确知道静态类型。
--
更多信息:
Anton 在下面建议 AppDomain 程序集绑定上下文可能是罪魁祸首。在做了一些测试后,我认为它很可能是。. . 但我不知道如何解决它!我不知道程序集绑定上下文,因此多亏了 Anton,我对程序集解析和那里出现的细微错误有了更多的了解。
所以我通过在启动脚本引擎之前在 C# 中的事件上放置一个处理程序来观察程序集解析过程。这让我可以看到 python 引擎启动并且运行时开始解析程序集:
...并且处理程序将 var pType 设置为python 正在加载的类型:
因此,虽然 python 使用的类型在 C# 中是相同的,但我认为(如 Anton 所提议的)不同的绑定上下文对运行时意味着,这两种类型(“加载绑定上下文”中的一种和'loadfrom binding context) 是不同的——所以你不能转换到另一个。
所以现在我已经掌握了由 Python 加载的类型(以及它的绑定上下文),你瞧,在 C# 中,我可以将动态对象转换为这个静态类型并且它可以工作:
但是,叹息,这并不能完全解决问题,因为pythonBoundContextObject
正确类型的 var仍然带有错误的程序集绑定上下文的污点。这意味着我不能将它传递给我的代码的其他部分,因为我们仍然有这种奇怪的类型不匹配,其中绑定上下文的不可见幽灵让我感到寒冷。
因此,解决方案必须在 Python 方面:让脚本加载到正确的程序集绑定上下文中。
在 Python 中,如果我这样做:
运行时无法解析我的类型:
.net - IDynamicMetaObjectProvider 最简单的实现是什么?
我有这种情况...
1.- 我为用户提供了一个“动态表”,可以定义字段。每个动态表将根据需要具有尽可能多的行/记录,但字段定义是集中的。
2.- 我的 Dynamic Row/Record 类继承自 .NET DLR DynamicObject 类,底层存储是一个与定义字段适当关联的列表。一切正常!但...
3.- 因为我需要对内容进行序列化,而DynamicObject不是Serializable,所以在需要动态成员访问的时候,我不得不生成并携带一个Dynamic Object。但这是丑陋和多余的。
所以,我需要自己实现 IDynamicMetaObjectProvider 来实现动态访问和序列化。
在谷歌搜索/搜索失败后,我请求你的帮助......有人可以举一个很好的例子(或相关链接)吗?
asp.net - 在 ASP.NET Web 请求期间评估 IronPython 脚本;静态引擎与否
我想创建一个 ASP.NET MVC Web 应用程序,它具有不需要重新构建的可扩展逻辑。我正在考虑创建一个具有 IronPython 引擎实例的过滤器。我想知道的是:在每个 Web 请求期间创建一个新引擎有多少开销,保留一个静态引擎会更好吗?但是,如果我要保留一个静态引擎,就锁定和脚本范围而言,我可能会遇到什么问题?是否可以在同一个 IropPython 引擎中有多个范围,这样我就不会在 Web 请求之间遇到变量冲突和安全问题?
dynamic - C# 4.0 动态类型的最常见应用
既然人们已经使用 C# 4.0 一段时间了,我想我会看到人们最常使用“动态”类型的情况,为什么这比以前更好地帮助他们解决了问题?
c# - C#猴子补丁 - 有可能吗?
是否可以编写一个 C# 程序集,该程序集在加载时会将方法从另一个程序集中注入到一个类中?如果是,注入的方法是否可以从使用 DLR 的语言(如 IronPython)中获得?
我需要那个方法,如果可能的话,我想避免重新编译 IronPython。
c# - 使用 DLR 更简单的 Linq to XML 查询
我有一个关于 Linq to XML 查询的问题,以及我们如何使用新的动态关键字使它们更具可读性。
目前我正在写这样的东西:
我想写的是这样的:
我知道我可以使用 Linq to XSD 来做到这一点,这已经很不错了,但显然这需要一个 XSD 架构,而我并不总是有一个。
我确信应该有一种方法可以使用 .NET 4.0 的新动态功能来实现这一点,但我不确定如何或是否有人已经尝试过。
显然我会失去 Linq to XSD 的一些优点(类型化成员和编译时间检查),但它不会比原始解决方案差,而且肯定会更具可读性。
有人有想法吗?
谢谢