【问题标题】:How to change output file folder based on device如何根据设备更改输出文件夹
【发布时间】:2013-02-12 14:28:49
【问题描述】:

首先我将从我想要完成的事情开始,然后我将提供上下文详细信息:

当我选择开始调试时,我希望根据通过 Windows Mobile 设备中心连接的设备来更改输出目录。 澄清:从我们的安装程序安装可以正常工作,但是从 Visual Studio 进行调试却给我带来了问题。

我正在使用 Visual Studio 2008。该项目是用 C# 为 Compact Framework 3.5 编写的智能设备项目,目标是 Windows Mobile 5.0 Pocket PC Device R2(根据项目设置)。我发现当我以这种设备类型为目标时,它可以在我们支持的所有 Windows Mobile 版本以及 Windows CE 6 上正常运行。任何建议的解决方案都必须在 Windows Mobile 和 Windows CE 上运行。

当我进入项目属性并进入设备选项卡时,它会显示输出文件夹:和输出路径。如果我单击 ... 按钮,我可以将其更改为不同的默认值,甚至将其设置为根文件夹,然后完全指定我想要的确切路径作为子目录。在大多数设备上,如果我将其保留在(设备默认值)或从下拉列表中选择程序文件文件夹,它工作正常。问题是当它在我们支持的 Windows CE 设备上运行时,它需要从不同的位置运行。

可能的解决方案

多项目解决方案:针对不同的设备拥有多个项目。这样做的问题是我不知道如何在不违反 DRY 原则的情况下执行某些需要包含在输出中的文件,并且我不想在不同的 Start 项目之间来回切换。

重新定义%CSIDL_PROGRAM_FILES% 解决方案:更改%CSIDL_PROGRAM_FILES% 的含义,因为它可以在指定程序文件所在位置的输出路径中。但是我不知道这是否可能或从哪里开始尝试。我想也许这会在设备注册表中定义,但我找不到它。

自定义路径变量解决方案:选择根文件夹,然后在子目录下以某种方式引用路径中的变量(可能以% 结尾?)我可以更改为我需要的路径(可能来自构建后或预部署(如果有这样的事情)脚本)。我不知道这是否可能或从哪里开始。

任何帮助将不胜感激,谢谢!

编辑:

经过一番挖掘,我最好的猜测是%CSIDL_PROGRAM_FILES% 是一个Windows CE 环境变量。我仍然不知道是否可以创建或修改这些。

【问题讨论】:

  • CSIDL(常量特殊项 ID 列表)值是用于引用随不同语言或操作系统构建而变化的位置的常量。它们不能被添加或修改。您在 Studio 中看到的内容被传递到 CoreCon API,被推送到设备,然后在设备端进行翻译。
  • @ctacke 感谢您分享您的专业知识。您确定没有办法改变设备转换这些常量的方式吗?那时涉及什么技术?我知道这是一个很长的尝试,您已经说过这是不可能的,但有时从知识较少的人那里听到问题会开启新的思考过程。

标签: visual-studio-2008 compact-framework environment-variables windows-ce windows-mobile-5.0


【解决方案1】:

首先我尝试在项目文件中使用环境变量:

    <DeploymentTool
    ForceDirty="-1"
    RemoteDirectory="$(ceRemoteDir)"
    RegisterOutput="0"
    AdditionalFiles=""
/>

但不幸的是,只有在您启动 VS 时才会更新,以后不会更新。

我会使用免费的remote tools 使用自定义部署脚本。

使用 preg 您应该能够识别批处理脚本中的不同设备:

pregutl.exe hklm\Ident

例如会给出:

[HKLM\Ident]
Desc=""
Name="CK7007121144066"
OrigName="Pocket_PC"
Restriction=dword:00000002
Username="guest"

在一台设备上,在另一台设备上我得到:

[HKLM\Ident]
Desc="Intermec CN3 Device"
Name="CN3A32110646073"
OrigName="IntermecCN3"
Restriction=dword:00000002
Username="guest"

在 bat/cmd 文件中过滤,然后根据 pregutl 查询使用 pput 将 exe 部署到不同的目录应该不难。

然后可以使用 bat/cmd 文件代替 VS 部署作为 Post-Built Event。

是的,这一切都有些复杂,但会奏效。

【讨论】:

  • 我在发布这个问题之前尝试了这些工具。我成功部署到了正确的位置,但是,我还想从 Visual Studio 调试。我不熟悉使用构建后事件,但我想即使我在构建后事件中正确部署文件,Visual Studio 也会在之后将自己的部署到错误的位置,然后附加调试器到程序的另一个副本,而不是我从自定义脚本部署的那个。这也会产生每次我进行构建时部署的不良副作用。
  • 我认为官方的方法是有不同的配置。设备类型 1 的 Debug_DeviceType1 配置和 Debug_DeviceType2。在配置中,您可以指定硬编码的部署和调试路径。如果连接了一台设备,则使用配置一,而对于另一台设备,则使用配置二。更改配置只需在 VS2008 工具栏中单击即可。 - 顺便说一句:VS 可以设置为不部署。手动部署 exe 后,您可以在 Debug 中使用 attach-to-remote。但是你无法调试远程进程的启动。
  • 不得不在不同的配置之间来回切换是可以接受的代价,而且还不如拥有多个项目并一直更改哪个项目是启动项目那么糟糕。如何配置 VS 以针对不同的配置使用不同的调试和部署路径?
【解决方案2】:

如果我对您的理解正确,我看到您可以采取以下几个选项:

  1. 让您的安装程序将这些可执行文件放在您需要的文件夹中,或者

  2. 将您需要的所有数据放在一个中心位置(\Program Files\Data 文件夹)。

不过,第一个选项本身很难调试(通过 VS2008 环境是不可能的)。

您甚至可以将两者结合使用!

现在,我要去看看josef 链接到的所有这些工具。 他从哪里弄来这么多酷玩具?

【讨论】:

  • 实际上,我已经有一个安装程序,可以将所有内容安装在正确的位置。不能很好地从 VS 调试。不过你确实给了我一些想法。我可以将它设计为从任一位置运行,即使从另一个位置运行它有优势,并且安装程序仍会将它放在那里。不过,我仍在寻找更好的解决方案,因为我想在生产环境中进行测试。
【解决方案3】:

使用不同的解决方案/项目配置来使用不同的输出路径和调试设置:

在 VS 中右键单击解决方案和“配置管理器”

在“活动解决方案配置”下方的列表中单击

现在输入一个新的描述性名称,以及可以为新配置复制哪些设置。请启用“创建新项目配置”并单击确定

您现在有了一个新的解决方案和一个新的项目配置。

单击“确定”关闭解决方案配置管理器。

要更改所有或单个项目配置的设置,您必须右键单击解决方案,然后选择属性

现在您可以为每个配置设置不同的设置。

“Release_Device1”配置的部署设置:

但“发布”配置的不同部署设置:

您还可以在配置集中有不同的调试设置:

有什么要补充的吗?

【讨论】:

  • 这看起来很有希望。我目前没有我需要的设备。我很快就会再来一次,然后我会试试这个。谢谢。
  • 由于某种原因,我在解决方案属性下没有这些选项。左边的树只有配置属性下的配置。配置属性下没有部署叶。这是什么版本的VS?我有 VS 2008 Pro 9.0.3.0729.1 SP。
  • 我尝试从项目属性中更改此设置,希望它会根据配置进行设置,但它会为所有配置保留这些设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2021-11-11
相关资源
最近更新 更多