昨天在InfoWorld上关于新微软Roslyn的新闻稿中:
这种"解构"编译器最明显的优点是它允许从.Net应用程序内部调用整个编译执行过程.Hejlsberg演示了一个C#程序,它将一些代码片段作为字符串传递给C#编译器; 编译器将生成的IL汇编代码作为对象返回,然后将其传递到公共语言运行库(CLR)以供执行.瞧!使用Roslyn,C#获得了动态语言在运行时生成和调用代码的能力.
自从.NET 4发布以来,我已经能够做到这一点CSharpCodeProvider.CompileAssemblyFromSource,实际上我在之前编写的一个ASP.Net项目中使用它实际上就是这样 - 允许用户在文本框中键入代码,选择程序集/名称空间引用,然后执行并显示该代码的输出,以便在Windows Azure上进行实时环境代码测试.
是CodeDomRoslyn的一部分/前身吗?罗斯林的特殊好处是CodeDom什么?
使用Reflection.Emit库与CodeDOM在运行时动态生成代码有什么优缺点?
我试图在基于XML格式运行时可用元数据的系统中生成一些(相对复杂的)动态类.我将生成扩展应用程序集中现有类的类,实现其他接口,添加方法以及覆盖虚拟和抽象成员.
我想确保在深入实现之前选择适当的技术.有关这些不同代码生成技术如何不同的任何信息都会有所帮助.此外,任何有关简化或简化工作的开源库的信息都将是有用的.
多年来,我的应用程序从1MB增长到25MB,我预计它将进一步增长到40,50 MB.我不使用DLL,但把所有东西放在这个大的可执行文件中.
拥有一个大的可执行文件有一些优点
大型EXE的最大缺点是连接时间似乎呈指数级增长.
另外一个问题是代码的一部分(比如大约40%)与另一个应用程序共享.再次,优点是:
但同样,这会严重影响编译时间(每个人都会在PC上再次编译公共代码)和链接时间.
分组DLL在Executable中使用的问题提到了将DLL混合在一个可执行文件中的可能性,但看起来这仍然需要您在应用程序中手动链接所有函数(使用LoadLibrary,GetProcAddress,...).
您对可执行文件大小,DLL的使用以及易于部署和简单/快速开发之间的最佳"平衡"有何看法?
有没有办法用CodeDom生成类约束.
因为当我使用类似的东西
var method = new CodeMemberMethod();
var genericParam = new CodeTypeParameter("InterfaceType");
genericParam.Constraints.Add("class");
method.TypeParameters.Add(genericParam);
Run Code Online (Sandbox Code Playgroud)
生成的代码就像
private InterfaceType GetImpl<InterfaceType>()
where InterfaceType : @class
{
}
Run Code Online (Sandbox Code Playgroud)
我发现最好的解决方法是在课前使用前导空格
genericParam.Constraints.Add(" class");
Run Code Online (Sandbox Code Playgroud)
但这似乎充其量只是一种解决方法.
有没有办法使用Codedom生成C#自动属性,或者我可以使用其他一组libreries ?
有没有人试过在.NET 4.0下使用System.CodeDom生成扩展方法?似乎没有任何方法可以将CodeMemberMethod或CodeParameterDeclarationExpression指定为扩展方法/参数.
如果无法做到这一点,有什么好的解决方法吗?
谢谢
除了C#,VB.NET,C++(Managed和C++/CLI)和F#之外,哪些.NET编程语言都有自己的CodeDom提供程序?
有没有办法使用C#CodeDom生成字典初始化程序?那些支持吗?
我想拥有:
private IDictionary<string, string> map = new Dictionary<string, string>
{
{ "Name", "Value" },
...
};
Run Code Online (Sandbox Code Playgroud)