[英]OpenNETCF and Windows Embedded Standard O/S
如果我有一個用 .net Compact Framework 編寫的應用程序(並在 Windows CE 上運行)並且理論上與 Windows 使用 OpenNETCF 的功能兼容,它是否仍然兼容?
例如在 OpenNETCF 的幫助下運行.exe 文件之類的東西。 我假設 OpenNETCF 在后台使用 P/Invoke,這可能會使應用程序與 Windows CE 以外的其他操作系統不兼容。
我沒有在我的代碼中使用 P/Invoke,但我無法確定 OpenNETCF 是否使用。
OpenNETCF 確實廣泛使用 P/Invoke。
它實際上是 Windows CE 及其衍生產品中某些核心操作系統功能的包裝器,在 Compact Framework 中沒有以其他方式實現。 在實踐中,這意味着對 coredll.dll 的廣泛 P/Invoking; Windows CE 的基本操作系統模塊。
Windows 嵌入式標准是 Windows XP。 因此,我不希望您能夠使用 OpenNETCF。
根據您使用的版本,您可能能夠在此處獲取 OpenNETCF 代碼(當然也可以購買最新的),並查看引擎蓋下發生了什么。 此外,您可能會發現,在為 Windows 嵌入式標准編譯時,您對 OpenNETCF 的調用實際上已經實現。
解決此問題的一種方法是創建另一個以該平台為目標的項目,包含完全相同的代碼文件,但不引用 OpenNETCF,然后修復編譯錯誤。
您可以向 CE 項目或 Windows 嵌入式項目添加條件編譯符號,然后像這樣修復錯誤(此示例不適用於 OpenNETCF,但您明白了):
public static string ExecutingAssembly
{
get
{
#if WindowsCE
return Assembly.GetExecutingAssembly().GetName().CodeBase;
#else
return Assembly.GetExecutingAssembly().Location;
#endif
}
}
顯然,您必須為每個平台創建一個構建,因為輸出的程序集現在會有所不同。
正如 Chris 所指出的,SDF大量使用 coredll P/Invokes。 這並不是說一切都可以,但這肯定是一個雷區。 我傾向於有一個 CF 項目和一個 FFX 項目,並且我有重疊的地方我使用別名,如下所示:
#if WindowsCE
using Thread = OpenNETCF.Threading.Thread2;
#else
using Thread = System.Threading.Thread;
#endif
然后在代碼中你只是做你的正常
var thread = new Thread(...);
事情就解決了。
很久以前,我們確實開始了一個有趣的副項目,即為桌面創建一個 coredll “shim” 。 這意味着桌面上對“coredll”的 ap/invoke 實際上會調用 DLL,這反過來會將調用編組到 kernel32、user32 或其他任何東西。 我們對我們實現的東西的測試(並且那里有很多)表明它工作得很好,所以如果你使用有限的 API 子集,只需將它放到 PC 上可能會使 CF 程序集“正常工作”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.