如果我有一个用编写的应用程序(在Windows CE上运行),并且理论上与.net Embedded Standard O/S兼容,那么如果它使用OpenNETCF功能,它还会兼容吗?
例如,在OpenNETCF的帮助下运行.exe文件。我假设OpenNETCF在幕后使用P/Invoke,这可能会使应用程序与Windows CE以外的其他操作系统不兼容。
我没有在我的代码中使用P/Invoke,但我不能确定OpenNETCF是否使用。
发布于 2011-05-26 07:10:03
OpenNETCF确实广泛使用P/Invoke。
它实际上是Windows CE及其衍生产品中某些核心OS功能的包装,这些功能没有在Compact Framework中以其他方式实现。在实践中,这意味着大量调用coredll.dll;Windows CE的基本操作系统模块。
Windows Embedded Standard是Windows XP。出于这个原因,我不希望您能够使用OpenNETCF。
根据您使用的版本,您也许能够获得OpenNETCF代码here (当然也可以购买最新版本),并了解幕后发生了什么。此外,您可能会发现,您对OpenNETCF的调用实际上是在为Windows Embedded Standard编译时实现的。
解决此问题的一种方法是创建另一个针对此平台的项目,该项目包含完全相同的代码文件,但不引用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-26 10:34:19
正如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,而DLL又会将调用编组到kernel32、user32或其他任何地方。我们对我们实现的东西的测试(有相当一部分)表明它工作得很好,所以如果你使用的是有限的API子集,那么只需将它放在PC上就可以使CF程序集“工作”。
https://stackoverflow.com/questions/6131692
复制相似问题