根据构建配置修改WMAppManifest.xml

时间:2010-12-02 16:51:10

标签: visual-studio silverlight windows-phone-7

我想发布我的应用程序的不同风格,并希望在手机上显示的应用程序名称中指出这一点。据我所知,Silverlight Phone Apps的名称完全取决于WMAppManifest.xml。因此,我想根据构建配置在构建时修改应用程序标题。有什么建议吗?

3 个答案:

答案 0 :(得分:13)

你可以通过一些T4模板和代码生成来实现这一点(如果你不知道这一点,请参见http://msdn.microsoft.com/en-us/library/bb126445.aspx。)

如果您使用调试或发布配置,以下步骤将允许您使用不同的应用程序标题。

获取WMAppManifest.xml的副本并将其重命名为WMAppManifest-base.tt

WMAppManifest-base.tt的内容更改为

<#@ template language="C#" #><#@ output extension=".xml" #><?xml version="1.0"?>
<Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deployment" AppPlatformVersion="7.0">
  <App xmlns="" ProductID="{4c5315b6-4030-46c5-b5ea-17284d6af0c6}" Title="<#= this.ConfiguredAppTitle #>" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal"  Author="WindowsPhoneApplication8 author" Description="Sample description" Publisher="WindowsPhoneApplication8">
    <IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPath>
    <Capabilities>
      <Capability Name="ID_CAP_IDENTITY_DEVICE"/>
      <Capability Name="ID_CAP_NETWORKING"/>
    </Capabilities>
    <Tasks>
      <DefaultTask  Name ="_default" NavigationPage="MainPage.xaml"/>
    </Tasks>
    <Tokens>
      <PrimaryToken TokenID="WindowsPhoneApplication8Token" TaskName="_default">
        <TemplateType5>
          <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI>
          <Count>0</Count>
          <Title><#= this.ConfiguredAppTitle #></Title>
        </TemplateType5>
      </PrimaryToken>
    </Tokens>
  </App>
</Deployment>
<#+ 
    string ConfiguredAppTitle = "MyPhoneApp";
#>

(视情况调整能力等。)

在与WMAppManifest-base.tt相同的文件夹中,使用以下内容创建名为Debug.WMAppManifest.tt的文件:

<#
  ConfiguredAppTitle = "MyDebugApp";
#><#@ include file="WMAppManifest-base.tt" #>

现在创建一个名为Release.WMAppManifest.tt的文件,其中包含以下内容:

<#
  ConfiguredAppTitle = "MyReleaseApp";
#><#@ include file="WMAppManifest-base.tt" #>

在项目的根目录中创建一个名为copyifnewer.bat的文件。给它以下内容:

echo Comparing: %1 with %2

if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound

fc %1 %2 
if %ERRORLEVEL%==0 GOTO NoCopy

echo Files are not the same.  Copying %1 over %2
copy %1 %2 /y & goto END

:NoCopy
echo Files are the same.  Did nothing
goto END

:File1NotFound
echo %1 not found.
goto END

:File2NotFound
copy %1 %2 /y
goto END

:END

在项目属性中添加此PRE-build命令:

"$(ProjectDir)\copyifnewer.bat" "$(ProjectDir)properties\$(ConfigurationName).WMAppManifest.xml" "$(ProjectDir)properties\WMAppManifest.xml"

现在您可以在调试和调整中调整值。发布文件以根据需要更改标题。

如果您有其他配置,只需创建适当命名的文件(内容与debug.*.tt相同),它们将自动被选中。

请注意,在测试时,如果您使用一个名称安装应用程序(在模拟器或手机中),则必须将其卸载才能看到应用程序列表中反映的名称更改。

自我注意:必须发表关于此的博客。 (它真的很强大,但很难弄清楚如何第一次做。)

答案 1 :(得分:4)

您可以使用条件命令行在项目属性中使用预构建步骤(项目属性 - &gt;构建事件 - &gt;预构建事件命令行)来实现此目的。

为每个版本提供文件,然后复制默认值以替换那里的数据。您还可以设置图标以使用同一系统! :)

if $(ConfigurationName) == Phone_Free_Debug (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Free.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Free.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Free.png $(ProjectDir)200x200icon.png
)
if $(ConfigurationName) == Phone_Free_Release  (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Free.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Free.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Free.png $(ProjectDir)200x200icon.png
)

if $(ConfigurationName) == Phone_Debug  (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Paid.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Paid.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Paid.png $(ProjectDir)200x200icon.png
)
if $(ConfigurationName) == Phone_Release  (
  copy /Y $(ProjectDir)Properties\WMAppManifest_Paid.xml $(ProjectDir)Properties\WMAppManifest.xml 
  copy /Y $(ProjectDir)173x173icon_Paid.png $(ProjectDir)173x173icon.png
  copy /Y $(ProjectDir)200x200icon_Paid.png $(ProjectDir)200x200icon.png
)

答案 2 :(得分:0)

我知道这是一个旧线程,但是当我想要做类似事情的时候遇到它,并且接受的答案对我来说很明显。我只想添加一个修改批处理文件部分的建议,以防它帮助其他人。我会对已接受的答案发表评论,但到目前为止缺乏声誉,所以希望没有人介意我将其作为一个单独的答案加入..!

如果您正在对您的解决方案进行版本控制(例如在TFS中),您的WMAppManifest可能会受到写保护,除非您特别记得在构建之前检查它。如果是,批处理文件将无法覆盖它,但您不会收到任何通知,并且构建将继续,这意味着您可能没有注意到它没有按照您的构建配置进行更新。要解决此问题,请将以下内容添加到批处理文件的末尾(在:END之后):

if %errorlevel% neq 0 exit /b %errorlevel%

如果批处理文件失败,则构建将停止,提醒您该问题。

另外,不要在Visual Studio中创建批处理文件!它将保存为UTF-8编码(我认为),当Windows尝试shell时它可能会出错。在记事本中创建它以确保它以ASCII格式保存。如果用错误的编码保存它并且它不会运行,上面的修改也会捕获它。