1

如果我有一个用 .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 和 windows Embedded 标准

4

2 回答 2

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

事情就解决了。

很久以前,我们确实开始了一个有趣的副项目,即为桌面创建一个 coredll “shim”。这意味着在桌面上对“coredll”的 ap/invoke 实际上会调用该 DLL,这反过来会将调用编组到 kernel32、user32 或其他任何东西。我们对我们实现的东西的测试(并且那里有很多)表明它工作得很好,所以如果你使用有限的 API 子集,只需将它放到 PC 上可能会使 CF 程序集“正常工作”。

于 2011-05-26T02:34:18.547 回答
2

OpenNETCF 确实广泛使用 P/Invoke。

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

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

根据您使用的版本,您可能可以在此处获取 OpenNETCF 代码(当然也可以购买最新的),并查看引擎盖下发生了什么。此外,您可能会发现,在为 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
        }
    }

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

于 2011-05-25T23:10:02.583 回答