2014-04-21 46 views
2

我有一個語言編譯器,我剛剛更新了目標.NET 4.0,並且框架程序集的元數據生成器現在在System.Data.dll上失敗,而所有其他工作正常(mscorlib,系統等)System.Data.dll上的系統程序集.NET上的.NET反射失敗

元數據生成器只是簡單地加載程序集,反映所有類型和成員信息,並生成語言的存根類。

我使用Assembly.Load()和/或Assembly.ReflectionOnlyLoad()

無法加載文件或程序集「文件:/// C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ System.Data.dll' 或它的一個依賴關係。試圖加載一個格式不正確的程序 。

它是爲「AnyCPU」構建的。我正在運行安裝了.NET 4.5更新的Windows 7/x64。

+2

我幾個月前有這個問題,這個環節幫我: http://jepsonsblog.blogspot.co.il/2010/12/could-not-load-file-or-assembly.html 你碰到這個了嗎? –

+1

根據谷歌「試圖加載格式不正確的程序」,例如http://blogs.msdn.com/b/arvindsh/archive/2009/06/21/tip-of-the-day-an-attempt-was-made-to-load-a-program-with-an-不正確的format-net-p-invoke-issue.aspx它似乎是32位和64位的問題。不知道大約64位,但在我的情況下,總是需要標記EXE調用..Load爲x86,以便它只加載32位庫。應該可以使用Mono.Cecil – xmojmr

+0

同時加載32位和64位。這是解決它。我可以使用x86 for colastub,因爲它被稱爲子進程並將元數據作爲文本返回。我的實際需求是從.NET程序集訪問類型元數據,這樣我就可以將它們公開爲可樂類。我可以考慮Mono.Cecil。它是用.NET自己編寫的,還是本地C/C++?不幸的是,我在10年前開始使用可口可樂編譯器作爲業餘愛好,當時我在使用C++作爲我的主要語言之前,在Mono存在之前,現在我很遺憾沒有用C#編寫它。我希望能夠直接訪問CLR程序集而不使用存根程序。 – codenheim

回答

2

如果您使用corflags工具來分析程序集,您應該看到ILONLY: 0爲System.Data.dll,而其他(mscorlib,系統)ILONLY: 1。有關ILONLY的更多信息,請參閱here

因此,組件的構建方式不同,您不應該期望反射適用於所有人。 System.Data.dll似乎是一個混合模式的程序集,總是與位相關。

如果您無法以32位運行您的應用程序以加載32位程序集,則可以考慮將Mono.Cecil視爲@xmojmr,表示爲it supports reading mixed-mode assemblies

+0

謝謝,將應用切換到x86可以解決問題。這可以作爲x86運行,因爲它是一個存根生成器,編譯器作爲子進程運行以讀取類型元數據。謝謝! – codenheim