代码之家  ›  专栏  ›  技术社区  ›  B. Clay Shannon-B. Crow Raven

为什么我的模拟器部署失败,并显示“进程无法访问文件,因为它正被另一个进程使用”?

  •  2
  • B. Clay Shannon-B. Crow Raven  · 技术社区  · 11 年前

    我正在将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智能手机设备R2”,并得到错误:“ 部署和/或注册失败,出现错误:0x8973190e。写入文件'\Windows\NETCFv35.wm.ARMV4I.cab'时出错。错误0x80070070:磁盘空间不足。 设备连接组件 "

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

    …哦,天哪,我真的想再次使用模拟器,而不是将其部署到实际设备上。

    更新3

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

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

    enter image description here

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

    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);
    }
    

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

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

    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
    }
    
    2 回复  |  直到 11 年前
        1
  •  3
  •   jp2code    11 年前

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

    System Tab

    水龙头 Memory 然后点击 Running Programs 选项卡。

    Running Programs

    找到您的应用程序,然后单击。。。呃,我是说踢踏 Stop .

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

    为了防止将来发生这种情况,请打开Project的主窗体,查看该窗体的财产,然后设置 ControlBox False .

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

    ControlBox

    不过,我已经很久没有编码那个部分了,所以我可能会有点偏离。

    有一件事可以肯定地结束它,那就是在 Close() 命令,就像我为我的 Exit 菜单项:

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

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

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

        2
  •  3
  •   ctacke    11 年前

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

    编辑

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

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

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