【问题标题】:OpenNETCF and Windows Embedded Standard O/SOpenNETCF 和 Windows Embedded Standard O/S
【发布时间】:2011-05-25 22:25:18
【问题描述】:

如果我有一个用 .net Compact Framework 编写的应用程序(并在 Windows CE 上运行)并且理论上与 Windows Embedded Standard O/S 兼容,如果它使用 OpenNETCF 功能,它是否仍然兼容?

例如在 OpenNETCF 的帮助下运行 .exe 文件。我假设 OpenNETCF 在后台使用 P/Invoke,这可能会使应用程序与 Windows CE 以外的其他操作系统不兼容。

我没有在我的代码中使用 P/Invoke,但我无法确定 OpenNETCF 是否使用。

.net compact framework 2.0 and windows embedded standard

【问题讨论】:

    标签: compact-framework windows-ce opennetcf windows-embedded


    【解决方案1】:

    OpenNETCF 确实广泛使用 P/Invoke。

    它实际上是 Windows CE 及其衍生产品中某些核心操作系统功能的包装器,而紧凑型框架中没有实现这些功能。在实践中,这意味着对 coredll.dll 的大量 P/Invoking; Windows CE 的基本操作系统模块。

    Windows Embedded Standard 是 Windows XP。因此,我不希望您能够使用 OpenNETCF。

    根据您使用的版本,您也许可以获取 OpenNETCF 代码here(当然也可以购买最新的),并查看幕后情况。此外,您可能会发现,在为 Windows Embedded Standard 编译时,您对 OpenNETCF 的调用实际上已经实现了。

    解决此问题的一种方法是创建另一个以该平台为目标的项目,包含完全相同的代码文件,但不引用 OpenNETCF,然后修复编译错误。

    您可以向 CE 项目或 Windows Embedded 项目添加 条件编译符号,然后像这样修复错误(此示例不适用于 OpenNETCF,但您明白了):

        public static string ExecutingAssembly
        {
            get
            {
    #if WindowsCE
                return Assembly.GetExecutingAssembly().GetName().CodeBase;
    #else
                return Assembly.GetExecutingAssembly().Location;
    #endif
            }
        }
    

    显然,您必须为每个平台创建一个构建,因为输出的程序集现在会有所不同。

    【讨论】:

    • 很高兴知道。你知道哪些命名空间使用它,哪些不使用吗?我目前正在使用 OpenNETCF.IO; OpenNETCF.Windows.Forms; OpenNETCF.WindowsCE 命名空间。我应该假设他们都使用 P/Invoke 吗?谢谢
    • OpenNETCF 是巨大的,是的,我猜 P/Invoke 用于大多数(如果不是全部)它的命名空间。不过,我已经在上面详细说明了一种可能的前进方式。
    【解决方案2】:

    正如 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(...);
    

    一切顺利。

    很久以前,我们确实开始了an interesting side project of creating a coredll "shim" for the desktop。这意味着在桌面上对“coredll”的 p/invoke 实际上会调用该 DLL,这反过来会将调用编组到 kernel32、user32 或其他任何东西。我们对我们实现的东西的测试(那里有很多)表明它工作得很好,所以如果你使用有限的 API 子集,只需将它放到 PC 上可能会使 CF 程序集“正常工作”。

    【讨论】:

    • 这是一个有趣的副业。
    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多