我正嘗試使用反射來生成動態裝配&在.NET中發射。我收到一個錯誤,「通用語言運行時檢測到一個無效的程序。」我創建了另一個具有我想要的硬編碼類型功能的程序。我試圖編寫的功能最終將使用動態類型,但是我可以使用ILDasm來查看我需要生成的IL。我將我生成的IL與編譯器生成的IL進行比較。在.locals初始化一個方法的聲明我看到有在編譯器生成的代碼的附加項目,CLR IL-方形支架在.locals上的重要性初始化
編譯器生成的:
.locals init ([0] class [System.Core]System.Linq.Expressions.ParameterExpression CS$0$0000,
[1] class [System.Core]System.Linq.Expressions.ParameterExpression[] CS$0$0001)
礦:
.locals init (class [System.Core]System.Linq.Expressions.ParameterExpression V_0,
class [System.Core]System.Linq.Expressions.ParameterExpression[] V_1)
我不理解編譯器生成的代碼中「[0]」和「[1]」的含義。誰能告訴我這是什麼意思?
作爲一個更普遍的問題,我可以遵循大多數ILDasm輸出,而不會有太多的麻煩。但我經常碰到一個有問題的表達。舉例來說,在這條線從ILDASM
callvirt instance class [EntityFramework]System.Data.Entity.ModelConfiguration.EntityTypeConfiguration`1<!!0> [EntityFramework]System.Data.Entity.DbModelBuilder::Entity<class DynamicEdmxTrial.HardFooAsset>()
了「!0」可能指的是通用型的實體<>的,但我不肯定知道,我不知道是否有一個關鍵以ILDasm輸出,這將解釋其更加模糊的輸出給我。
「我收到一個錯誤,」公共語言運行時檢測到一個無效的程序。「」您是否嘗試過在您的程序集上運行PEVerify? – svick
另外,你究竟如何得到這些'.locals'?都來自ILDasm? – svick
「無效的程序」我不太在意。我想我已經找到了。兩個.local聲明來自ILDasm。它顯然發現了C#代碼和我的Reflection.Emit之間的一些區別。 – jrv