簡體   English   中英

是否可以使用CodeDOM獲取在內存中生成的程序集的流?

[英]Is it possible to get a stream for an assembly generated in memory using CodeDOM?

在我的一些測試中,我需要生成一些程序集,然后使用ICSharpCode.Decompiler “反編譯”它們,它使用Mono.Cecil來檢查程序集。

出於性能原因,我想在內存中生成程序集以避免磁盤I / O.

你可以找到一些我打算使用的代碼:

var cdp = CodeDomProvider.CreateProvider(CodeDomProvider.GetLanguageFromExtension("cs"));

var p = new CompilerParameters { GenerateInMemory = true } ;

var cr = cdp.CompileAssemblyFromSource(p, sources);
if (cr.Errors.Count > 0)
{
    throw new Exception(cr.Errors[0].ErrorText);
}

// !!! I'd like to avoid building / loading the assembly to / from disk
// var assembly = AssemblyDefinition.ReadAssembly(assemblyPath, readerParameters);

// Instead, I'd like to do something like:
Stream assemblyStream = GetAssemblyContentAsStream(cr.CompiledAssembly);

var assembly = AssemblyDefinition.ReadAssembly(assemblyStream, readerParameters);

var dc = new DecompilerContext(assembly.MainModule);

var astBuilder = new AstBuilder(dc);
astBuilder.AddType(typeToBeConverted);

var output = new StringWriter();
astBuilder.GenerateCode(new PlainTextOutput(output));

所以問題是:是否可以實現GetAssemblyContentAsStream()?

出於性能原因,我想在內存中生成程序集以避免磁盤I / O.

這是編程的偉大神話之一。 現代操作系統太聰明,不足以使磁盤I / O成為瓶頸。 您的程序實際上並不將程序集寫入磁盤,而是將其寫入文件系統緩存。 內存。 寫入磁盤稍后會發生在后台運行的內核線程中,並且對perf沒有影響。

非常相似,將“記憶”視為RAM也是一個神話。 程序分配虛擬內存 它根本不是內存,它是在頁面文件中分配的空間。 在磁盤上。 操作系統的工作是在程序需要時為該程序提供該空間。 將頁面文件分配映射到RAM。 寫入磁盤的時間稍晚,發生在另一個進程需要RAM時運行的內核線程中。

看到相似度? 沒有區別 您可以觀察到的唯一可能的副作用是當您在具有非常有限的RAM的計算機上運行時。 當文件系統緩存中沒有足夠的可用空間時,程序必須等到數據寫入文件。 這樣的機器也很難使RAM可用於您的程序。 它需要丟棄其他進程(或您自己的)使用的RAM頁面,將它們寫入磁盤。 換句話說,您的程序開始很慢而不是很慢完成工作。 凈差異接近於零。

程序集的大小決不會對現代計算機上文件系統緩存可用的RAM量造成壓力。 一個簡單的千兆字節至少。 所以,不要打擾,你永遠不會真正看到性能提升。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM