升級到 VS2019 16.2.3 後,要執行 Xamarin.Android 專案,卻得到 System.IO.FileNotFoundException: 'Invalid Image' 錯誤訊息
最近這兩個月因為忙於 Xamarin.Forms 的授課,所以,一直沒有將上課用的 Surface Pro 4 電腦上的 Visual Studio 2019 軟體升級到最新版本,本來想等到 09/03 最後一天課程上完之後,再來進行 Visual Studio 2019 的升級工作,沒想到 09/03 當天授課的時候,卻發現到 Visual Studio 2019 無法打開,電腦上顯示需要我把 Visual Studio 進行升級,這是我最擔心的一件事情,因為,每次軟體有升級的時候,都會怕對於上課過程中有些影響(這也就是為什麼,當會進行類似 Xamarin.Forms 6 天這樣長時間的授課時候,通常不會把 Visual Studio 進行升級 ,一來擔心新功能的推出對於授課會有,二來擔心有些狀況僅會出現在新升級後的電腦,而學員的電腦上的 Visual Studio 卻沒有升級,造成不一致的問題;所以,在上課之前,我通常是僅會將作業系統進行更新到最新版本這樣的動作而已。
好的,那麼當天究竟發生了甚麼事情?當我將 Visual Studio 2019 升級到最新版本,也就是 16.2.3 版本,當我使用了 Prism Template Pack 建立起一個 Xamarin.Forms 的專案後,首先在 Visual Studio 2019 的錯誤視窗中,看到了底下的訊息。
警告 Skipping BlankApp2.Droid.Resource.Attribute.actionBarSize. Please check that your Nuget Package versions are compatible. BlankApp2.Android
雖然該訊息僅是個警告訊息,不過,還是覺得怪怪的,緊接著開始進行 Xamarin.Android 的專案建置與執行的動作,不幸的是,此時在螢幕上顯示了 System.IO.FileNotFoundException Message=Invalid Image 這個錯誤訊息,如同底下螢幕截圖顯示的狀況。
這下慘了,課程僅進行到 30 分鐘,若無法建立一個空的 Xamarin.Forms for Prism 專案,那麼要如何繼續底下 6個小時的課程呢?(心裡有著 今日可以提早完課,下次再來的念頭)。
我還是先花了一些時間做了檢測,首先,看到在 Visual Studio 2019 輸出視窗中的最後一行,看到了
Assembly Loader probing location: '/storage/emulated/0/Android/data/com.companyname.appname/files/.__override__/Xamarin.Interactive.dll'. **System.IO.FileNotFoundException:** 'Invalid Image'
這樣的訊息,我想,這個訊息應該是上面對話窗所遇到的主要問題。
接下來的內容,是我回到家裡後,使用另外一台電腦上的 Visual Studio 2019,也把它升級到 16.2.3 版本,結果看到相同的問題,但是,當我不使用 Prism Template Pack 來產生一個 Prism Blank App (Xamarin.Forms) 的應用程式,而是使用 Visual Studio 2019 內建的 行動應用程式 (Xamarin.Forms) 專案範本,建立起一個空的 Xamarin.Forms 的專案,卻沒有發現到這個專案在建置與執行過程中,會出現上述的問題,一切都可以正常運作。
我針對 使用 Prism Template Pack 所產生的 Xamarin.Form 專案,打開 Xamarin Android 專案內的 MainActivity.cs 檔案,接著,在 OnCreate 方法內加入訂閱 AppDomain.CurrentDomain.UnhandledException 這個事件,看看是否能夠捕捉到任何可疑的例外異常錯誤資訊,並且在
int foo = 10;
這個敘述上設定一個中斷點,若執行的過程中可以停在剛剛設定的那行中斷點上,那麼,也許可以從 UnhandledExceptionEventArgs 這個參數中,看到一些端倪。protected override void OnCreate(Bundle bundle)
{
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
// 這一行是要用於設定中斷點之用
int foo = 10;
};
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App(new AndroidInitializer()));
}
當修正好了之後,再度執行這個專案,依然還是看到這個這個錯誤訊息,並且並沒有停留在剛剛設定的中斷點上,所以,這應該是這個專案尚未啟動到 MainActivity 的時候,就產生了問題。
現在回到 Xamarin.Forms 授課當天,那時,只好針對幾個設定項目進行測試,看看是否可以讓課程繼續進行下去,這個時候,只要使用 Prism Template Pack 建立的專案,可以正常建置、執行,那麼,當天的課程就可以繼續下去囉。
這裡是當天解決這個問題的其中一個做法
- 首先打開 Xamarin.Android 專案的屬性設定視窗 (可以滑鼠右擊 Android 專案節點,選擇最後面的屬性項目,或者在 Android 專案內找到 Properties 節點,使用滑鼠雙擊這個節點)
- 當 Android 屬性視窗出現之後,切換到 Android 選項 標籤頁次 Tabbed,且解除 使用 Fast Deployment (僅限偵錯模式) 這個選項)
注意,底下的螢幕截圖,是 使用 Fast Deployment (僅限偵錯模式) 這個選項被設定的狀態,請要解除該 Checkbox 的設定
現在,重新建置與執行這個專案,看看能否執行起來
喔喔,這樣的設定終於解除的當前危機,再度建立一個新的 Prism Black App 專案,看看是否會有同樣的效果,結果也是沒有問題。
另外一個解法則是剛剛測試出來的,不需要取消 使用 Fast Deployment (僅限偵錯模式) 這個選項設定,維持著 Fast Deployment 的設定,不過,在同一個標籤頁次下,也就是 Android 專案屬性視窗下的 Android 選項視窗中,往下捲動將會看到 正在連結 這個設定。
一開始使用 Prism Template Pack 建立起來的 Xamarin Android 專案中,其 正在連結 設定為 無 ,現在可以修正為 僅限 SDK 組譯碼 這個選項,我發現到可以維持在除錯模式下持續使用 Fast Deployment 的機制,也可以正常運作。