2009-06-11 183 views
3

我有一個編譯爲「任何CPU」的.Net應用程序。我在64位操作系統上運行它,所以它運行的是64位。該應用程序加載用戶提供的其他程序集。它使用當然反射從用戶提供的程序集中讀取類型。如果用戶程序集編譯爲「任何CPU」,一切工作正常。但是,如果程序集編譯爲x86,則在反射時會出現「這不是Win32應用程序」異常。這顯然是由於主機應用程序運行64位的事實。從x64位操作系統上的「任何CPU」構建應用程序反映x86程序集操作系統

我的問題是,我該如何解決這個問題?任何想法/想法?

謝謝

回答

0

您可以複製文件並更改位。

0

如果你只是爲了反思的目的而加載它,你可以使用Mono.Cecil,我認爲它應該沒問題。

或者獲取dll的副本,對文件運行corflags以翻轉32位唯一標誌,然後加載副本。

第一個好得多and faster只是反映,從來不想實際實例化類型,但本質上更多的努力。第二個是容易出錯(dll可能依賴於非託管代碼,當通過反射掃描觸發時,無論如何都會失敗)

作爲第三個替代選項來避開這個問題,只需強制您的應用運行作爲32位只,然後它應該加載一切就好了你真的真的必須運行64位?

+0

如果我運行32位,我會碰到64位程序集的問題,這也是我的情況。 我可能會嘗試使用ReflectionOnly加載並查看是否有效。我所需要做的只是在程序集上反映讀取類型。我實際上沒有執行任何操作。嗯...我需要查看屬性,所以這可能是一個問題,因爲查看它執行它:/ – Nazeeh 2009-06-11 19:23:36

+0

只有64位.Net程序集在我的經驗中非常罕見,它們幾乎總是混合模式。你可能正在使用它們的工作,但考慮是否需要打擾。閱讀類型/屬性是塞西爾會爲你做的事情,所以我建議你去那條路線... – ShuggyCoUk 2009-06-12 11:05:50

5

好吧,我想通了,這只是一個簡單類型發現的程序集,但沒有實例化,如果程序集是32位,則使用Assembly.ReflectionOnlyLoad工作

使用Assembly.ReflectionOnlyLoad加載程序集並允許您使用r反映在類型上。您也應該掛鉤到AppDomain.CurrentDomain.ReflectionOnlyLoadResolve。

要獲取屬性名稱,您需要在類型,方法或模塊上使用CustomAttributeData.GetCustomAttributes。

static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve += new ResolveEventHandler(CurrentDomain_ReflectionOnlyAssemblyResolve); 
     Assembly assm = Assembly.ReflectionOnlyLoadFrom("TestProject1.dll"); 

     Type t = assm.GetType("TestProject1.ProgramTest"); 
     MethodInfo m = t.GetMethod("MainTest"); 

     IList<CustomAttributeData> data = CustomAttributeData.GetCustomAttributes(t); 


    } 

    static Assembly CurrentDomain_ReflectionOnlyAssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     return Assembly.ReflectionOnlyLoad(args.Name); 
    } 
相關問題