上一章回顧: .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作
本篇將要闡述 包括但不僅限於Avalonia及所有Windows到Linux跨平台開發 的一些注意事項:
一、路徑問題
1.在平常的WPF(及windows應用軟件)開發中,訪問文件(懶一點的話)(比如我)通常就直接使用 字符串拼接
舉個例子,我們訪問軟件目錄下的\Data\xxx.txt文件:
string path = AppDomain.CurrentDomain.BaseDirectory+"\\Data\\xxx.txt";
在windows上可以完美運行...
如果你將這一習慣帶到了linux上,找不到文件還好,就怕...
(瞬間爆炸..)
這是因為:
在Windows中,文件路徑是以單反斜杠表示的: \ 例如:C:\xxx.txt
在Linux中,文件路徑是以反斜杠表示的:/ 例如:/home/xxx.txt
當你在linux中用\\表示的時候,linux會認為那就是文件名..而且這個文件放在windows找不到也刪不了.....(別問我怎么知道的)
所以推薦使用以下方法對接路徑字符串:
Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"Data","xxx.txt");
2.如何正確地在Linux上獲取一個特殊文件夾(我的文檔之類的)
大家都知道 Environment.GetFolderPath 這個方法 但是它在Linux上不是很正常:
MSDN上說:
但是我在deepin linux 上測試的結果並不是這樣....
MyDocuments輸出了: /root
Personal輸出了:/home/twlm(我的用戶名)
所以你想要正確地獲取“我的文檔”文件夾,可以用:
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),"Documents", "XXXX");
以及判斷平台,在不同的平台上返回正確的路徑:
public static string MyDocumentsPath { get { if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),"Music", "LemonAppCoreDownload"); else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyMusic), "LemonAppCoreDownload"); else return "";//我沒有Mac OSX的機器就不搞了,可以參考文檔弄一下 } }
二、網絡訪問
我在deepin上測試的時候蹦出來一個非常奇怪的異常:
像是一個無法加載程序集的異常,是調用WebClient時產生的問題,但換成HttpWebRequest就沒了..
我當時發布時打開了 獨立->程序集裁剪 也有可能是這里的問題...(有大神知道求告知!)
同樣的問題出現在了Bass音頻解碼器上(簡介)
當你使用 Bass.BASS_StreamCreateURL 方法訪問url上的音樂文件時,無論網絡通暢或鏈接可訪問與否 都會報 TIMEDOUT 超時錯誤....(暫時沒有找到解救方法 我使用了先下載緩存后解碼的方法)
三、字體渲染問題
這個我在deepin上沒有多大問題(中英文能正常顯示 韓語和日語不行)
可以參考以下文檔: https://www.cnblogs.com/drzhong/p/11678701.html