代码之家  ›  专栏  ›  技术社区  ›  Mat Nadrofsky

最有价值的.Net Compact Framework提示、技巧和避免出现问题的方法是什么?[闭门]

  •  65
  • Mat Nadrofsky  · 技术社区  · 17 年前

    还有谁是移动开发人员,可以分享在紧凑框架中开发时开始做、停止做和避免做的事情?

    14 回复  |  直到 12 年前
        1
  •  120
  •   ctacke    14 年前

    当然:

    • 尽可能使用物理设备(而不是模拟器)
    • 集中测试睡眠/唤醒行为
    • 避免像瘟疫一样的ActiveSync-使用CoreCon direct进行调试
    • 避免在窗体的ctor中做大量工作-为延迟加载而卸载它或在后台线程中
    • 尽可能按需加载表单(不是一次加载所有表单)
    • 如果类公开Dispose . 总是
    • 没有哪个应用程序太小而不能从MVC/MVP模式中获益
    • 不要将Microsoft CAB/SCSF端口用于CF(移植它的人显然从未实际使用过资源有限的设备)
    • 如果您要进行任何远程数据/服务活动,请熟悉“偶尔连接”的概念
    • 对接和锚定是你的朋友和敌人-测试运行时屏幕旋转和多分辨率(即使你认为你不会瞄准它们,因为你的想法可能是错误的)
    • 请查看,但不要在设备部署包项目类型上大量投资。它有很大的局限性,可能会咬到你。批处理文件工作得出奇地好,或者使用自定义MSBUILD任务调用CabWiz
    • 刷上你的C++和p/唤起技巧。你 我需要它们。要编写一个有用的CF应用程序而不调用某些东西几乎是不可能的。
    • 编码到目标的最低公分母。
    • 分部类是您的朋友,特别是用于在目标类型(PPC、Phone、非移动CE)之间划分逻辑。
    • 避免从持久性存储运行应用程序,特别是对于CE和WInMo 5之前的版本。复制到RAM并从那里运行,以防止请求分页杀死您,特别是在睡眠/唤醒周期之后。
    • 应用程序不应该关心睡眠/唤醒转换,但这纯粹是理论。睡眠唤醒**将*改变你的应用行为,所以再次测试,测试,测试。
    • 我提到考试了吗?尤其是在每一台你能接触到的设备上?从易趣上为您的测试实验室购买便宜的硬件。拥有更多设备比拥有最新设备更重要,除非您打算使用更新设备的特定功能。
    • 观看有关Compact框架中内存管理的MSDN网络广播。再看一遍你第一次错过的东西。
    • 注意睡眠/唤醒会使内部句柄无效并导致访问冲突。这更为深奥,但肯定会发生。例如,如果您使用存储卡运行应用程序,则整个应用程序不会加载到RAM中。正在使用的工件按需分页以供执行。这一切都很好。现在,如果关闭设备电源,驱动程序将全部关闭。当您进行电源备份时,许多设备只需重新装载存储设备。当你的应用程序需要在更多的程序中添加页面时,它就不在原来的位置了,它就会死掉。装载存储上的数据库也可能发生类似的行为。如果数据库的句柄已打开,则在睡眠/唤醒周期后,连接句柄可能不再有效。
    • 安装 evaluation version of Platform Builder . 很多东西的源代码都在那里(比如网络用户界面、许多驱动程序等等),当你的P/Invoke代码没有达到你期望的效果时,你至少有地方去寻找“为什么”。

    10年5月25日增补

    2010年7月27日增补

    我只是简单地把它们添加到我想到的列表中。。。

        2
  •  13
  •   Mitch Wheat    17 年前

    OpenNETCF 这是一个巨大的资源。

    Smart Device Framework 是使用.NET Compact Framework开发时必须具备的功能,因为许多完整的Framework功能都缺失了[我想有人曾经说过.NET Compact Framework是围绕NotImplementedException的包装器!]

        3
  •  11
  •   Community Mohan Dere    8 年前

    这不是特定于 然而,由于在移动平台上开发的资源限制,在开发紧凑型框架设备时,它的丑陋程度更高。


    最近,我在一篇关于管理内存泄漏的文章中看到了一篇很棒的文章,这篇文章帮助我识别了一个我不知道的内存泄漏 bug when setting the DataGrid.DataSource

    绑定DataGrid时,您应该 直接使用类似于:

    dgDataGrid.DataSource = dsDataSet;
    

    bsData.DataSource = dsDataSet;
    
    dgDataGrid.DataSource = bsData;
    

    谁知道呢?斯科特·兰厄姆参加了比赛 another post . 谢谢斯科特!

        4
  •  7
  •   MusiGenesis    17 年前

    另一个有用的技巧是以一种方式包装ShowDialog调用,使您可以将父窗体的标题临时设置为“”,这样可以防止应用程序中所有打开的窗体显示在正在运行的程序列表中。增强包装器的另一种方法是使用父窗口的句柄PInvoke SetForeGroundIndow。这样可以确保在关闭子对象后,父对象始终会重新出现;如果没有此调用,则可以在父窗体上方的z堆栈中插入其他窗口。

    注意SD卡上的加密。SqlCE将完全停止工作。OracleLite在加密下的行为更加险恶,因为它的一部分工作,另一部分不工作。

    避免SqlCE RDA和合并复制。如果这些工具能够可靠地工作,那么它们将是非常好的工具,但是在复制过程中网络连接可能意外中断的情况下(在WM世界中非常常见),这些工具就不适用了。这件事让我在制作应用程序上受了点苦。我们处理的MS支持技术最终被迫承认它无法100%工作。实际引语:“只要继续尝试复制-它们最终会正确合并”。

        5
  •  7
  •   Martin Liesén    17 年前
        6
  •  7
  •   Vaccano    14 年前

    仅供参考,如果您对VisualStudio2010中没有Compact Framework支持感到不安,请继续 here 并投票赞成将其加入。(并传播信息)

    User Voice site to vote 对于此功能。

        7
  •  4
  •   ollifant    17 年前
    • 如果您计划使用Sql Server 3.5 Compact read this blog
    • SQL Server Compact存在严重的性能问题,与桌面相比,某些代码在设备上的速度可能慢100倍,因此请始终在设备上测试数据库代码。
    • 如果您一直在部署代码,请使用网络而不是ActiveSync。最简单的方法是在设备上设置一个简单的FTP服务器或TCP代理。
        8
  •  4
  •   sharky101    15 年前

    使用Compact Framework和SqlCe时,性能、内存泄漏和线程同步可能会出现很多问题。

    1. 使用一个SqlCe连接-可以在连接上使用锁定机制,以便在多个线程上使用一个连接。
    2. 由于Sqlce引擎,大容量数据插入速度较慢。使用直接表插入,这与直接写入文本文件具有类似的性能优势。
    3. 在应用程序关闭时处理SqlCe连接。这确保所有资源都已清理。
    4. 在每次调用数据库后处理所有命令、数据读取器等。使用语句是你的朋友。使用语句等确保读卡器对象位于命令内部。。。
        9
  •  3
  •   sarsnake    17 年前

    OpenNETCF值得研究——即使是免费版也有一些有用的lib——比如FTP、datagrid附加功能等;这是非常有用的,因为CF缺少很多.net framework功能。

        10
  •  3
  •   Chris Brandsma    17 年前

    在.net cf上可以进行单元测试(TDD),但也存在一些问题。

    您将使用MSTest。不是NUnit、MBUnit、XUnit.net等MSTest。

    您将需要Visual Studio Professional(据我所知)。开始测试的最简单方法是右键单击要测试的方法,然后选择“创建单元测试”。这将为您设置测试项目。只创建一个测试项目。它不喜欢有多个。只需执行此操作即可创建项目并为您设置所有依赖项。然后创建自己的测试类。

    模拟对象可能是一个问题。Rhinomock、Moq和TypeMock都依赖于.net cf中不可用的东西。Pex有一个名为Stubs的项目,我仍在研究。Pex是微软的一个研究项目。最终将创建自定义的伪对象。

    测试在设备仿真器上运行。这意味着必须部署它们。如果在第一次启动测试运行程序时出现奇怪错误,则设备模拟器上可能还没有.net 3.5。首先部署项目,然后再次运行测试。

    您确实可以将LINQ转换为对象,并将LINQ转换为XML。两者都是天赐之物。 您可以通过WCF与服务器通信,但无法获得所有端点。

        11
  •  2
  •   Mat Nadrofsky    17 年前

    posted on Chris Craft's blog :

    using System.Windows.Forms;
    using System.Data;
    
    public static void SortDataGrid(object sender, System.Windows.Forms.MouseEventArgs e)
    {
       DataGrid.HitTestInfo hitTest;
       DataTable dataTable;
       DataView dataView;
       string columnName;
       DataGrid dataGrid;
    
       // Use only left mouse button clicks.
       if (e.Button == MouseButtons.Left)
       {
       // Set dataGrid equal to the object that called this event handler.
       dataGrid = (DataGrid)sender;
    
       // Perform a hit test to determine where the mousedown event occured.
       hitTest = dataGrid.HitTest(e.X, e.Y);
    
       // If the MouseDown event occured on a column header,
       // then perform the sorting operation.
       if (hitTest.Type == DataGrid.HitTestType.ColumnHeader)
       {
          // Get the DataTable associated with this datagrid.
          dataTable = (DataTable)dataGrid.DataSource;
    
          // Get the DataView associated with the DataTable.
          dataView = dataTable.DefaultView;
    
          // Get the name of the column that was clicked.
          if(dataGrid.TableStyles.Count != 0)
             columnName = dataGrid.TableStyles[0].GridColumnStyles[hitTest.Column].MappingName;
          else
             columnName = dataTable.Columns[hitTest.Column].ColumnName;
    
          // If the sort property of the DataView is already the current
          // column name, sort that column in descending order.
          // Otherwise, sort on the column name.
          if (dataView.Sort == columnName)
             dataView.Sort = columnName + " DESC";
          else
             dataView.Sort = columnName;
          }
       }
    }
    
    private void dgDataGrid_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
       if(dgDataGrid.VisibleRowCount == 0) return;
       SortDataGrid(sender, e);
       dgDataGrid.Select(dgDataGrid.CurrentRowIndex);
    }
    
        12
  •  2
  •   thekindofme    15 年前
    • 在.net cf中,您将遇到许多错误和限制。您必须对它们进行修补。这很难看,但你别无选择。

    • 您最终将编写大量自定义控件。因为框架中的大多数控件不支持客户端通常请求的功能。因此,从一开始就为您使用的每个控件创建自定义控件是一种很好的做法。即使你刚开始的时候可能什么都没有。以后可以添加自定义逻辑。无需修改大量现有代码。

    • 如果需要验证,可以使用 .net validation framework

    • 在应用程序中的任何地方都可以快速编写代码,这是一个好主意。您可以使用MVC模式。如果你选择使用它,你可以通过使用 MobileMVC
    • 如果你需要一个丰富的UI工具包,你可以看看Resco(谷歌it)。
    • VS设计师将是你最大的敌人。

    这就是我现在能想到的。

        13
  •  1
  •   PhilChuang    17 年前

    使用了望台会话执行任何操作时,始终

    • 在主(应用程序)线程上实例化它
    • (我使用控件对象来调用 反对)
    • 时间框架(如果你没有,你将有 口袋中的奇怪行为(Outlook)
        14
  •  1
  •   James Hulse    15 年前

    使用Windows Mobile时,如果不希望表单全屏显示,则需要设置 FormBorderStyle 没有一个 特色 (使用Windows Mobile)

    推荐文章