我有一個編譯爲「任何CPU」的.Net應用程序。我在64位操作系統上運行它,所以它運行的是64位。該應用程序加載用戶提供的其他程序集。它使用當然反射從用戶提供的程序集中讀取類型。如果用戶程序集編譯爲「任何CPU」,一切工作正常。但是,如果程序集編譯爲x86,則在反射時會出現「這不是Win32應用程序」異常。這顯然是由於主機應用程序運行64位的事實。從x64位操作系統上的「任何CPU」構建應用程序反映x86程序集操作系統
我的問題是,我該如何解決這個問題?任何想法/想法?
謝謝
我有一個編譯爲「任何CPU」的.Net應用程序。我在64位操作系統上運行它,所以它運行的是64位。該應用程序加載用戶提供的其他程序集。它使用當然反射從用戶提供的程序集中讀取類型。如果用戶程序集編譯爲「任何CPU」,一切工作正常。但是,如果程序集編譯爲x86,則在反射時會出現「這不是Win32應用程序」異常。這顯然是由於主機應用程序運行64位的事實。從x64位操作系統上的「任何CPU」構建應用程序反映x86程序集操作系統
我的問題是,我該如何解決這個問題?任何想法/想法?
謝謝
您可以複製文件並更改位。
如果你只是爲了反思的目的而加載它,你可以使用Mono.Cecil,我認爲它應該沒問題。
或者獲取dll的副本,對文件運行corflags以翻轉32位唯一標誌,然後加載副本。
第一個好得多and faster只是反映,從來不想實際實例化類型,但本質上更多的努力。第二個是容易出錯(dll可能依賴於非託管代碼,當通過反射掃描觸發時,無論如何都會失敗)
作爲第三個替代選項來避開這個問題,只需強制您的應用運行作爲32位只,然後它應該加載一切就好了你真的真的必須運行64位?
好吧,我想通了,這只是一個簡單類型發現的程序集,但沒有實例化,如果程序集是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);
}
如果我運行32位,我會碰到64位程序集的問題,這也是我的情況。 我可能會嘗試使用ReflectionOnly加載並查看是否有效。我所需要做的只是在程序集上反映讀取類型。我實際上沒有執行任何操作。嗯...我需要查看屬性,所以這可能是一個問題,因爲查看它執行它:/ – Nazeeh 2009-06-11 19:23:36
只有64位.Net程序集在我的經驗中非常罕見,它們幾乎總是混合模式。你可能正在使用它們的工作,但考慮是否需要打擾。閱讀類型/屬性是塞西爾會爲你做的事情,所以我建議你去那條路線... – ShuggyCoUk 2009-06-12 11:05:50