VS2005 中的 C#:设备项目可以同时针对完整框架和 CF 吗?

2024-05-27

我们正在 Visual Studio 2005 下使用 Compact Framework 为设备进行开发。但是,我们也希望制作该软件的模拟版本,在 PC 上运行(最好通过构建配置进行选择)。

然而,.vsproj 文件似乎是特定于设备的;例如,无法仅通过更改目标来使用完整的 .NET 框架。

有没有办法解决?我想我们可以在 PC 上运行紧凑框架,但该项目仍然无法以 ARM 处理器为目标,否则我认为 JIT 编译器将为 PC 生成无法使用的代码?


You can在常规 Windows 中运行 Compact Framework 应用程序(也许)。然而,这有两个主要的潜在问题。

首先,由于紧凑框架中缺少完整框架中存在的某些表单和控件属性,因此您的应用程序在 Windows 中的行为会有点奇怪。例如,在完整框架中,表单具有 StartPosition 属性,该属性确定表单首次创建时在屏幕上显示的位置。此属性在紧凑框架中不存在(出于明显的原因),因此当您在常规 Windows 中运行 CF 应用程序时,表单会选择默认的 StartPosition 值WindowsDefaultLocation,这意味着设置窗体的 Left 和 Top 属性不会影响它们的显示位置,因此窗体会在任何位置弹出。

其次,CF 中的任何 Windows API PInvoke 调用都必须引用“coredll”,而完整框架中的相同调用则引用“user32”、“winmm”等。解决此问题的一种方法是执行以下操作:

[DllImport("winmm.dll", EntryPoint="waveOutReset")]
private static extern int waveOutResetFULL(IntPtr hWaveIn);
[DllImport("coredll.dll", EntryPoint="waveOutReset")]
private static extern int waveOutResetCF(IntPtr hWaveIn);
public static int waveOutReset(IntPtr hWaveIn)
{
    if (Environment.OSVersion.Platform == PlatformID.WinCE)
    {
        return waveOutResetCF(hWaveIn);
    }
    else
    {
        return waveOutResetFULL(hWaveIn);
    }
}

还有其他方法可以做到这一点。

对于第一组问题,一个解决方案是当应用程序在常规 Windows 中运行时,通过反射设置紧凑框架中缺少的属性。我认为更好的选择是将 UI 的所有元素封装为 UserControl,每个元素托管在一个“主”UserControl 上,该“主”UserControl 根据需要创建和处置其他 UserControl 元素。然后,您可以将单个“主”UserControl 托管在表单的单个实例上。

顺便说一句,我为一家大型造船厂编写了一个应用程序,它正是执行此操作(在 Windows 和 Windows Mobile 设备上运行),并且仍在使用中。事实上,当造船厂因安全原因暂时停止使用移动设备时,该应用程序在两种环境中运行的能力确实挽救了它的生命。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2005 中的 C#:设备项目可以同时针对完整框架和 CF 吗? 的相关文章

随机推荐