Jor*_*ohl 14 c# performance cci dynamic-assemblies roslyn
使用Roslyn编译为动态程序集时,我遇到了性能问题.编译花了大约3秒,相比之下,使用CodeDom
编译器编译相同代码的时间约为300毫秒.这是我用来编译的代码的简化版本:
var compilation = CSharpCompilation.Create(
"UserPayRules.dll",
syntaxTrees,
assembliesToAdd);
using (var stream = new MemoryStream())
{
stopWatch.Start();
var result = compilation.Emit(stream);
stopWatch.Stop();
Debug.WriteLine("Compilation: {0}", stopWatch.ElapsedMilliseconds);
if (!result.Success)
{
throw new InvalidOperationException();
}
var assembly = Assembly.Load(stream.GetBuffer());
}
Run Code Online (Sandbox Code Playgroud)
这个答案建议将ModuleBuilder对象传递给Emit方法而不是MemoryStream,以加快速度.我试图遵循这种模式,如下:
var compilation = CSharpCompilation.Create(
"UserPayRules.dll",
syntaxTrees,
assembliesToAdd);
var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("ThisAssembly"),
AssemblyBuilderAccess.RunAndCollect);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("ThisModule");
var result = compilation.Emit(moduleBuilder);
Debug.WriteLine("Compilation: {0}", stopWatch.ElapsedMilliseconds);
if (!result.Success)
{
throw new InvalidOperationException();
}
var assembly = Assembly.Load(stream.GetBuffer());
Run Code Online (Sandbox Code Playgroud)
但我的Roslyn版本显然没有超载的Emit
方法需要一个ModuleBuilder
.那个版本是:
Id: Microsoft.CodeAnalysis
版本: 0.6.4033103-beta(预发布)
项目信息: http ://msdn.microsoft.com/en-US/roslyn
显然,这是一个预发布,所以api可能已经改变并不奇怪.然而,
Emit
方法似乎不再需要一个超载ModuleBuilder
?CodeDom
Mono编译器的优点,我不想放弃)?小智 10
Roslyn目前不公开发射动态组件的能力.我们删除它是因为它有问题.
您仍然可以MemoryStream
使用Compilation.Emit
API 发出,然后使用Assembly.Load(byte[])
加载生成的二进制文件.
请注意,在AppDomain
卸载包含之前,不会释放此程序集.
归档时间: |
|
查看次数: |
3347 次 |
最近记录: |