OpenNETCF和Windows Embedded Standard O / S.

时间:2011-05-25 22:25:18

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

如果我有一个用.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

2 个答案:

答案 0 :(得分:2)

OpenNETCF确实广泛使用P / Invoke。

它实际上是Windows CE及其衍生产品中某些核心操作系统功能的包装,而Compact Framework中没有实现。在实践中,这意味着广泛的P / Invoking coredll.dll; 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
        }
    }

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

答案 1 :(得分:2)

正如克里斯指出的那样,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程序集“正常工作”。 / p>