2010-10-18 43 views
3

我正在使用包含一個類的Reflection.Emit生成動態程序集。我有一個導致BadImageException的錯誤。爲了解決這個問題,我需要看到已編譯的代碼,因此我將動態程序集保存到磁盤。當Reflector沒有時,Open Emitted程序集生成代碼在Reflector中顯示爲空。

我已經試過PEVerify反對大會這似乎認爲沒有錯誤。我現在想要在Reflector中查看生成的代碼,但程序集顯示爲空(我知道它不是)。

任何想法爲什麼會發生這種情況?

var assemblyName = new AssemblyName("An.Assembly"); 
var appDomain = Thread.GetDomain(); 
var assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name); 
var typeBuilder = moduleBuilder.DefineType("MyClass", TypeAttributes.Public | TypeAttributes.Class); 
... 
typeBuilder.CreateType(); 
assemblyBuilder.Save("temp.dll"); 

通過我已經使用了Relection.Emit插件反射器不與這個問題上需要幫助的方式。

+0

BadImageFormatException?這是奇怪的。更好地記錄異常,消息+堆棧跟蹤。 – 2010-10-18 20:10:46

+1

當你用ildasm來看它時,它是否爲空? – 2010-10-18 20:12:16

+0

不是它的BadImageException是由IL代碼的發射中的一些錯誤引起的。即使我恢復我的代碼,以便它不拋出異常,我仍然無法查看反射器中的發射代碼。 – TheCodeKing 2010-10-18 20:17:10

回答

10

替換:

var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name); 

有了:

var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, "yourfilename.dll"); 

然後尋找當前目錄中,可能是你的bin文件夾。程序集和模塊在技術上是兩個獨立的實體,只保存程序集信息,而不是模塊信息(所有代碼都在其中)。 (當然,不要將它們命名爲相同的文件名。)

+0

這種情況沒有區別,無論哪種情況下文件都被寫出。 – TheCodeKing 2010-10-18 20:21:41

+0

@TheCodeKing,你嘗試過嗎?無論哪種情況,都會寫出文件,但重要的是,**文件**的內容不一樣。 – 2010-10-18 20:22:53

+0

對不起,我收回,我仍然打開temp.dll,但它實際上創建了另一個名爲「an.assembly.dll」,其中包含代碼!非常感謝,我花了很長時間試圖找出這個問題。 – TheCodeKing 2010-10-18 20:26:05

相關問題