2

我正在将 Windows CE 解决方案从 .NET 1.1 移植到 3.5

我能够“部署”它——一次——(到Pocket PC 2003 SE Emulator),并运行.exe,但它失败并显示错误消息。

关闭模拟器后,我在Visual Studio 2008 IDE的构造函数中设置了一个断点导致问题,并再次部署,希望单步执行代码,看看问题出在哪里。

然而,我并没有被这个编码器的涅槃,而是被编译器的这个公报刺痛了:

“部署和/或注册失败并出现错误:0x8973190e。写入文件'%CSIDL_PROGRAM_FILES%\ABC\ABC.exe'时出错。错误0x80070020:该进程无法访问该文件,因为它正被另一个进程使用。设备连接组件”

考虑到模拟器的进程可能像南方姐妹会外面的疙瘩一样徘徊,我关闭了 Visual Studio 并重新启动。我再次捣碎了 F5,充满了人类胸中永恒的希望,只是再次被同样的信息搭讪。

我需要做什么才能让我的模拟器回来?

作为一个<aside>,我觉得奇怪的是我无法截取模拟器的屏幕截图 - PrtScn 和 Alt+PrtScn 都无法用其像素填充剪贴板。

更新

我随后部署到“USA Windows Mobile 5.0 Pocket PC R2 Emulator”,我的应用程序在该“设备”上运行,但是当我尝试让应用程序通过它的步伐时,我得到:“异常:文件或程序集名称'System.Core ,Version=3.5.0.0 ...,或其依赖项之一,未找到

我看到文件资源管理器有一个“.NET CF 2.0”文件夹,但没有“.NET CF 3.5”文件夹——但是使用 3.5 的应用程序已部署到设备(至少部分)......我是否正确假设会有这样一个文件夹?如果没有,System.Core 3.5 版应该放在哪里?

更新 2

接下来,我尝试“Windows Mobile 5.0 Smartphone Device R2”,得到错误:“部署和/或注册失败,错误:0x8973190e。写入文件'\Windows\NETCFv35.wm.ARMV4I.cab'时出错。错误0x80070070:那里磁盘空间不足。设备连接组件

宾夕法尼亚嘻哈!(关键说唱!)

...哦,哎呀-我实际上想再次使用模拟器,而不是将其部署到实际设备上。

更新 3

我再次收到此错误消息,直接部署到设备。我今天运行了几次,最后几次它失败了,可能是一个糟糕的 REST 调用(客户端上的措辞错误)。现在我又看到了这个“磁盘上没有足够的空间”爵士乐。

我尝试了 JP2Code 的建议,但我根本看不到正在运行的应用程序,也没有看到表面上存储名称的选项卡:

在此处输入图像描述

至于将 this.Close() 添加到退出代码中,已经存在的是:

DialogResult userResponse =
    MessageBox.Show("Are you sure you want to exit Duckbill?", Platypus.GetFormTitle("", "", ""),
        MessageBoxButtons.YesNo,
        MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

if (userResponse == DialogResult.Yes)
{
    Dispose(false);
}

我不知道为什么最初的编码员会这样做,但我认为这个花哨的代码避免了对 this.Close() 的调用——或者不是?

相当奇怪和可怕的自定义“处置”方法是(我的评论):

protected override void Dispose(bool disposing)
{
    dbconn.DBClose();
    base.Dispose(disposing);
    Application.Exit(); // Why?
    // I would add to that "Why?" comment above with a reference to this:
    // http://codereview.stackexchange.com/questions/23133/is-there-a-valid-answer-to-this-why-comment
    // This makes me think twice about removing it, though:
    // http://social.msdn.microsoft.com/Forums/en-US/clr/thread/15efa70b-0065-44ef-ab09-7088fefd52b0
    // If it becomes a problem/there are complaints about it crashing when closing, revisit...
    // Could this have been the cause of the NRE that I ended up "eating"? See frmEntry.saveDSD()'s 
    // catch block
}
4

2 回答 2

3

单击Start > Settings然后点击System选项卡。

系统选项卡

点击Memory,然后点击Running Programs选项卡。

运行程序

找到您的应用程序,然后单击...呃,我的意思是点击Stop

现在,关闭您的应用程序。

为防止将来发生这种情况,请打开项目的主窗体,查看该窗体的属性,然后设置ControlBoxFalse.

应该使应用程序在表单关闭时退出。

控制箱

不过,自从我编写那部分代码以来已经有很长时间了,所以我可能会有点离题。

肯定会关闭它的一件事是通过Close()像我为Exit菜单项所做的那样编写命令:

private void mi_Exit_Clicked(object sender, EventArgs e) {
  this.Close();
}

这应该足以退出应用程序。

现在,如何让设备重新激活在内存中运行的应用程序将是一个很好的学习技巧。不过,我猜 Visual Studio 对此并不友好,因为可执行文件的构建通常会有所不同。

于 2013-10-04T20:50:08.017 回答
3

模拟器上的旧应用程序进程仍在运行。重新启动模拟器,或者更好的是,使用远程进程查看器来查找并杀死它。

编辑

您遇到的最初错误肯定是由于该进程仍在目标设备上运行。请记住,每个项目都有针对目标设备的设置,因此很有可能您的 EXE 指向一个设备(仿真器是一个设备)而 DLL 指向不同的设备。然后 Visual Studio 会将这些程序集部署到不同的位置,因此您的 DLL 可能会转到模拟器,但 EX 会转到连接到 PC 的物理设备,而您根本没有意识到它在哪里运行。在这种情况下,重置模拟器不会停止该过程。是的,它可能会让人感到困惑。

第一次更新中的错误表明未安装 CF 3.5。如有必要,项目应部署它(您可以在项目属性中将其关闭)。您可以通过运行 cgacutil.exe 来验证它是否已安装(它应该在 \Windows 文件夹中)。不会有任何已安装的文件夹,因为 CF 应该直接进入 \Windows 目录。此外,请确认您没有安装 CF 2.0 和 3.5 - 这可能会导致头痛。很多头痛。

至于更新 2,Studio 正在尝试将 CF CAB 文件推送到您的目标设备以进行安装,但空间不足。

于 2013-10-03T22:31:48.007 回答