scope.SetVariable("math",?? typeof(System.Math)??);
还是我需要创建一个模块?
我正在考虑将脚本语言嵌入到我的一个软件项目中,并确定了两个选项:在运行时通过CodeDOM编译C#并嵌入基于DLR的脚本语言.这两个选项都可以让我完全访问.NET Framework.
我将编写脚本的操作是用户定义的DataRow转换和一组导致修改后的DataRow的元数据.我希望这些转换可以组合并经常调用.当然,我希望最终用户能够提供和修改变换.
考虑到这一工作量,使用一种方法比另一种方法有明显的优势吗?
我希望将特定的.Net类型公开给IronPython运行时.我可以做这个:
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
engine.Runtime.LoadAssembly(typeof(Program).Assembly); // current assembly with types
Run Code Online (Sandbox Code Playgroud)
但是这会将所有类型公开给运行时.是否可以选择性加载?
我想从C#创建一个IronPython类的实例,但我目前的尝试似乎都失败了.
这是我目前的代码:
ConstructorInfo[] ci = type.GetConstructors();
foreach (ConstructorInfo t in from t in ci
where t.GetParameters().Length == 1
select t)
{
PythonType pytype = DynamicHelpers.GetPythonTypeFromType(type);
object[] consparams = new object[1];
consparams[0] = pytype;
_objects[type] = t.Invoke(consparams);
pytype.__init__(_objects[type]);
break;
}
Run Code Online (Sandbox Code Playgroud)
我能够通过调用t.Invoke(consparams)来获取对象的创建实例,但是__init__似乎没有调用该方法,因此我没有使用我从Python脚本设置的所有属性.即使使用显式pytype.__init__调用,构造的对象仍然似乎没有初始化.
使用ScriptEngine.Operations.CreateInstance似乎也不起作用.
我正在使用.NET 4.0和IronPython 2.6 for .NET 4.0.
编辑:关于我打算如何做到这一点的小澄清:
在C#中,我有一个类如下:
public static class Foo
{
public static object Instantiate(Type type)
{
// do the instantiation here
}
}
Run Code Online (Sandbox Code Playgroud)
在Python中,以下代码:
class MyClass(object):
def __init__(self):
print "this should …Run Code Online (Sandbox Code Playgroud) 因此,c#已经发展为静态类型语言,并且在利用.net框架开发业务线应用程序方面做了一个非常完美的工作.
现在,显然,在最近的过去,微软已经开始实现其他基本范式的飞跃,而c#和.net从未真正声称是最近的工具.
其中之一是DLR
好的语言多样性 - 很棒,我在想,现在看来我必须改变我的思维方式当我用类编写我的业务实体时,如果我想利用这个功能......这很酷,我我都在学习新的东西.但在此之前,我在这方面对受尊敬的社区提出了一些问题.现在为了澄清,我对DLR和CLR的应用更感兴趣.
所以我们开始:
您认为,DLR是否是一个可行的功能,从企业商业软件开发的角度来看是否值得关注?这意味着,c#真的需要它作为一个功能来继续做它正在做的事情,还是在那时切换到一个标准的动态类型语言更有意义?
在CLR和DLR的开发和编写代码的组合在业务适用性方面如何发挥作用?具体的例子对我来说是最有价值的.
优点.
现在msdn说:
Provides Future Benefits of the DLR and .NET Framework
Languages implemented by using the DLR can benefit from future DLR and .NET Framework improvements. For example, if the .NET Framework releases a new version that has an improved garbage collector or faster assembly loading time, languages implemented by using the DLR immediately get the same benefit. If the DLR adds optimizations such as better compilation, the performance also …
我正在考虑限制使用C#的dynamic关键字.我的初始时间试验令人惊讶 - 100,000次迭代的性能下降不到一秒(可能是由于DLR缓存).
但是,我无法访问内存分析器,Eric Lippert写道:
然后它启动DLR [...] DLR然后启动一个特殊版本的C#编译器......
这是什么内存占用,并在动态代码被垃圾收集时卸载?
我正在使用Json.Net将json结果反序列化为ExpandoObjects使用如下代码:
var converter = new ExpandoObjectConverter();
dynamic d = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);
Run Code Online (Sandbox Code Playgroud)
除了在json模式的根目录下只有一个列表的响应之外,这对所有事情都很有用,例如:
string json = @"[{""title"": ""the title""}]";
Run Code Online (Sandbox Code Playgroud)
在JsonConvert这个方法的内容:
public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
return (T)DeserializeObject(value, typeof(T), converters);
}
Run Code Online (Sandbox Code Playgroud)
返回值DeserializeObject是在其中正确构造的List<object>,ExpandoObject但代码无法尝试将该列表强制转换为ExpandoObject本身(T的值).
我有一个失败的单元测试,可以解决这个问题,但我不确定如何List直接填充ExpandoObject.
这可能吗?DynamicObject有TryGetIndex这样我承担ExpandoObject可以有一个索引.是否有必要通过动态提供索引方法的实现来仔细构建一个类似于列表的expando实例,或者创建一个非expando DynamicObject来保存列表并从动态方法调用中调用正确的方法?
在IronPython 2.0.1中处理JSON的最佳方法是什么.原生Python"标准库"json看起来尚未实现.
如果我想使用Newtonsoft Json.NET库,我该怎么做?我可以将程序集添加到GAC,但我的其他选择是什么?
我为这个问题长度道歉,但我认为你们都觉得值得.在开始之前,让我说我真的想要生成一个独立的控制台应用程序,但遗憾的是,事实证明这是不可能的.该错误不会发生在控制台应用程序中.它不会发生在一个独立的ASP.NET应用程序中.它仅在Windows 7上的IIS 7.5中运行时发生.
该错误似乎与动态语言运行时有关,因为它涉及__TransparentProxy(通过WCF)和dynamic变量(int)的组合.产生问题的那一行是调用一个传递代理和动态int的静态方法(碰巧不包含方法体).
一旦调用该方法,w3wp.exe进程占用整个CPU并开始非常快速地增加内存(对我来说,每秒大约100兆,尽管它可能因为GC而逐渐减少).
若要重现此错误,请在Visual Studio中创建一个新的ASP.NET网站("新建"|"项目""C#"|"Web"|"ASP.NET Web应用程序").然后在IIS中创建一个新站点,其主目录是您的新项目.(另外,为每个人提供对该文件夹的完全读/写访问权限,并确保应用程序池使用.NET 4.0)为新站点提供特定端口,如7080.最后,将此代码粘贴到Global.asax.cs中:
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
dynamic dynamicId = 5;
var serviceUrl = "http://localhost:7182/FooServices.svc";
ChannelFactory factory = new ChannelFactory<IFooServices>(new WSHttpBinding(), new EndpointAddress(serviceUrl));
factory.Open();
IFooServices fooServices = ((ChannelFactory<IFooServices>)factory).CreateChannel();
BlowUpTheProgram(fooServices, dynamicId); // This line hangs
}
[ServiceContract]
public interface IFooServices
{
[OperationContract]
void Bar();
}
public static void BlowUpTheProgram(IFooServices eventServices, int authorMailboxId)
{
}
}
Run Code Online (Sandbox Code Playgroud)
现在通过http://localhost:7080(或您选择的任何端口)访问浏览器中的站点.让任务管理器准备就绪,因为您需要在确认报告的症状后终止w3wp.exe进程.
要确认代理和动态是否正在共同解决此错误,请更改此行:
dynamic dynamicId …Run Code Online (Sandbox Code Playgroud) c# dynamic-language-runtime dynamic iis-7.5 transparentproxy
我最近看到了一个示例,其中演示了以下内容:
T Add<T>(dynamic a, dynamic b)
{
return a + b;
}
Add<string>("hello", "world"); // Returns "helloworld"
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用表达式来创建"通用"添加功能:
ParameterExpression left = Expression.Parameter(typeof(T), "left");
ParameterExpression right = Expression.Parameter(typeof(T), "right");
var add = Expression.Lambda<Func<T, T, T>>(Expression.Add(left, right), left, right).Compile(); // Fails with System.InvalidOperationException : The binary operator Add is not defined for the types 'System.String' and 'System.String' when T == String.
Run Code Online (Sandbox Code Playgroud)
然后将此函数与字符串一起使用,它失败,因为String类型实际上并不实现+运算符,而只是String.Concat()的语法糖.
那怎么样,动态允许这个工作?我想在运行时它已超过使用String.Concat()重写+的点.