您是否会推荐使用Iron Ruby,Iron Python或PowerShell来使C#应用程序成为脚本宿主?
经过一些快速的修补,现在我倾向于PowerShell有两个主要原因(注意这些纯粹是我的意见,如果他们错了,我很想知道!!!):
1)在应用程序中创建包含类的运行空间很简单; 因此,您可以轻松地编写应用程序脚本.
2)我听说有一些传言说IronRuby和IronPython正在失去微软的支持,所以他们可能是一个糟糕的长期解决方案?
由于这是我第一次在应用程序中添加脚本,我欢迎所有可以从以前走过这条路的人那里得到的建议.
具体来说,除了让我知道你是否同意我的上述两点之外,我想知道IronRuby和IronPython是否比PowerShell更容易使用(对于用户而不是开发人员),如果您使用DLR的经验是就像将对象传递给powershell运行空间一样简单?如果我添加了对DLR和IR/IP脚本的支持,我的应用程序是否仍然可以向后兼容XP?
可以在生产系统中开始使用Iron Ruby和Iron Python吗?另外,托管它们还有其他要求吗?
而且,对于奖励积分,假设F#是一种与Python相同的函数式编程语言,那么在.NET框架中使用一个优于另一个是否有任何优势?
.net ironpython functional-programming dynamic-language-runtime
我们正在寻找应用程序中的一些内存泄漏,在进行一些操作(在我们的应用程序中加载和关闭一个项目)时,我们知道内存总是增加一点点.
我们已经找到了很多它们,但是现在,10个以上增加最多的类是(根据我们的工具,ANTS Memory Profiler 8.2):
不幸的是,我不知道这是什么,所以我有点难以找到我应该释放的内容.
我检查了实例树但是,它一直用微软的东西.
问题在于,当我们对项目进行"打开/关闭"时,我们会经历很多(大部分)代码.
编辑我们的应用程序的一部分使用dynamic关键字作为某些资源,它可能是链接的.这里的课程不是Disposable,我应该和他们做些什么吗?
编辑2
我很确定这与我的dynamic东西有关,似乎C#在使用动态时创建了一个缓存.但是目前我不知道它为什么会增长(我一直加载相同的类,我将始终拥有完全相同的签名),也不知道如何清除它.
因为他们在.Net 3.5.我知道他们在4.0,因为这是DLR的工作方式,但我对我们现在拥有的版本感兴趣.
.net linq dynamic-language-runtime expression-trees turing-complete
您知道.NET 4.0 DLR支持的动态语言列表吗?
我知道IronRuby,IronPython是受支持的.不确定IronScheme是否.F#?还有什么?
谢谢!
任何人都可以指出我在哪里可以获得有关IronJS的一些教程以及如何从C#4.0调用IronJS编写的方法
谢谢
C#4.0,IronJS
首先,我想提前为我的英语推荐.
我的问题是具体说明我需要在C#应用程序中能够解释为所述应用程序提供的Lua脚本.Lua脚本必须能够访问用C#编写的类.
在搜索堆栈溢出以获得答案后,我认为处理此主题的问题已经过时(我认为在动态语言运行时成为.NET Framework的一部分之前就已经问到了这些问题,而且我认为事情现在变得简单了DLR).
基本上,我想做的就是这个
TypeThatExecutesLua.MethodToLoadLuaScript(script.lua);
TypeThatExecutesLua.Execute();
Run Code Online (Sandbox Code Playgroud)
现在,假设我们不关心script.lua返回什么.但是有些情况下第二行会是这样的:
dynamic result = TypeThatExecutesLua.Execute();
Run Code Online (Sandbox Code Playgroud)
或者:动态结果; TypeThatExecutesLua.Execute(out result);
同样,如果可能的话,我希望能够将参数传递给脚本(不确定参数在这种情况下是否正确,我对脚本知之甚少),如下所示:
int argument
TypeThatExecutesLua.Execute(argument);
Run Code Online (Sandbox Code Playgroud)
这可能是一个非常基本的问题,但我真的很感激能够真正向我解释如何做到这一点的答案,而不是指向某个页面的链接,因为我缺乏基本知识来理解我遇到的大部分材料到目前为止,通过搜索网络(我相当擅长C#,但这超出了语言本身的范围).
作为最后一点,我想说,即使Lua是我的目标语言,如果解决方案与任何语言相似或相同,只需要在项目中下载和引用的dll以及dll的界面等各种变化本身,我想知道.
我想知道是否有人有幸获得一个DynamicObject序列化和使用WCF?
这是我的小测试:
[DataContract]
class MyDynamicObject : DynamicObject
{
[DataMember]
private Dictionary<string, object> _attributes =
new Dictionary<string, object>();
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string key = binder.Name;
result = null;
if (_attributes.ContainsKey(key))
result = _attributes[key];
return true;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_attributes.Add(binder.Name, value);
return true;
}
}
var dy = new MyDynamicObject();
var ser = new DataContractSerializer(typeof(MyDynamicObject));
var mem = new MemoryStream();
ser.WriteObject(mem, dy);
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
System.Runtime.Serialization.InvalidDataContractException未处理Message = Type'ElasticTest1.MyDynamicObject'无法从未使用DataContractAttribute或SerializableAttribute标记的类型继承.请考虑使用DataContractAttribute或SerializableAttribute标记基本类型"System.Dynamic.DynamicObject",或者从派生类型中删除它们.
有什么建议?
我们目前正在研究如何将IronPython(脚本)嵌入到我们的C#应用程序中.
我们看到它将为我们的最终用户带来的好处,使他们能够加入我们的应用程序,但一个不断出现的问题是我们如何为最终用户提供能够识别我们不同的输入上下文的代码编辑能力应用.
我知道我们可以提供一个带语法高亮的简单文本编辑器,但是我们如何更进一步,允许用户针对我们从应用程序公开的对象测试他们的脚本.请记住,我们将根据入口点的上下文公开不同的对象.
您如何允许最终用户在您的应用程序中测试,编写和编辑脚本?
PS - 我是新来的,所以如果我做得不对,请告诉我!
我有一个方便的实用程序方法,它接受代码并吐出内存中的程序集.(它使用CSharpCodeProvider,虽然我不认为这应该重要.)这个程序集像任何其他反射一样工作,但当与dynamic关键字一起使用时,似乎失败了RuntimeBinderException:
'object'不包含'Sound'的定义
例:
var assembly = createAssembly("class Dog { public string Sound() { return \"woof\"; } }");
var type = assembly.GetType("Dog");
Object dog = Activator.CreateInstance(type);
var method = type.GetMethod("Sound");
var test1Result = method.Invoke(dog, null); //This returns "woof", as you'd expect
dynamic dog2 = dog;
String test2Result = dog2.Sound(); //This throws a RuntimeBinderException
Run Code Online (Sandbox Code Playgroud)
有谁知道DLR无法处理这个问题的原因?有什么办法可以解决这个问题吗?
编辑:
createAssembly方法:
免责声明:其中一些内容包含扩展方法,自定义类型等.但它应该是不言自明的.
private Assembly createAssembly(String source, IEnumerable<String> assembliesToReference = null)
{
//Create compiler
var codeProvider = new CSharpCodeProvider();
//Set compiler …Run Code Online (Sandbox Code Playgroud) c# ×6
.net ×4
ironpython ×3
c#-4.0 ×2
clr ×1
dynamic ×1
ide ×1
ironjs ×1
ironruby ×1
linq ×1
lua ×1
memory-leaks ×1
overflow ×1
powershell ×1
profiler ×1
reflection ×1
scripting ×1