如果我有一个用.net Compact Framework编写的应用程序(并在Windows CE上运行)并且理论上与Windows Embedded Standard O / S兼容,如果它使用OpenNETCF功能它是否仍然兼容?
例如,在OpenNETCF的帮助下运行.exe文件。我假设OpenNETCF使用P / Invoke,这可能会使应用程序与Windows CE之外的其他操作系统不兼容。
我的代码中没有使用P / Invoke,但我无法确定OpenNETCF是否有。
答案 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>