VisualStudio更改调试xml命令行参数

VisualStudio更改调试xml命令行参数,xml,visual-studio,command-line-arguments,Xml,Visual Studio,Command Line Arguments,在Visual Studio->调试->命令行参数中 输入以下XML "<AppParameters><ConnectionString>Server=localhost;Database=MyDB;User Id=sa;Password=YouNameIt</ConnectionString></AppParameters>" 一切都很好 然后重新启动Visual Studio,在启动项目后,将出现以下错误: System.Xml.dll中发生

在Visual Studio->调试->命令行参数中 输入以下XML

"<AppParameters><ConnectionString>Server=localhost;Database=MyDB;User Id=sa;Password=YouNameIt</ConnectionString></AppParameters>"
一切都很好

然后重新启动Visual Studio,在启动项目后,将出现以下错误:

System.Xml.dll中发生类型为“System.Xml.XmlException”的未处理异常

当然,第一次,你会花一些时间调查发生了什么。第一个建议当然是你的错。但是你会看到:

"<AppParameters xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><ConnectionString>Server=localhost;Database=MyDB;User Id=sa;Password=YouNameIt</ConnectionString></AppParameters>"
“服务器=localhost;数据库=MyDB;用户Id=sa;密码=YouNameIt”
Visual Studio已更改命令行参数

为什么

我正在调试一个Python模块,遇到了同样的问题。半个多小时我都发疯了,但最后我终于明白了。注:

  • 我正在使用VS2k10

  • 与调试相关的设置存储在vcxproj.user文件中(我将其称为VUF)

在打开解决方案时,我从删除VUF开始。打开“项目属性页”对话框,默认值如下:

  • 命令:
    $(TargetPath)

  • 命令参数:

在生成VUF的同时(我甚至不必关闭对话框)。下面是它的内容(注意名称空间):

而CommandArguments变为:
-c“导入xmlrpc为打印解码('aaa')”

正如我们所知,VS以xml格式存储其设置(不是文件中的字符串表示,而是解析字符串表示的实际xml树)。我了解到,解析xml字符串(将其转换为树),然后将树转换回字符串,将(在大多数情况下)产生与原始字符串不同的结果

我描述了这种行为(这是关于Python解析器的,但我确信所有或许多解析器的行为都是相同的)

因此,我们在xml(项目设置)中有一个xml(我们希望以纯文本形式存储),当VS的解析器试图解析它时,它会混淆它,产生一种我认为很奇怪的行为:

  • 如果成功:

    • 它将添加
      xmlns
      属性,从而在对话框中以及传递给程序时弄乱原始xml文本
    • 当我们在VUF中传递它时,它将存储它
  • 如果由于某种原因失败(例如xml无效):

    • 当我们在对话框中传递它时,它将被存储(并且它将作为参数正确地传递给正在调试的可执行文件)
    • 它将逃避VUF中的xml特殊字符
在我绕了一圈之后,我找到了一种方法来部分克服这一点(这是一种蹩脚的解决方法,或者说是一种骗局):

  • 手动修改VUF,将xml转换为:

    
    E:\WinOBT\1.0.0.0\OPSWpython\2.7.10\x64\u d\python\u d.exe
    WindowsLocalDebugger
    $(OutDir)
    
  • 重新加载解决方案(因为VS不会在每次打开对话框时读取VUF,因为其内部树没有更改)


现在,xml字符串被正确地传递给可执行文件,并正确地显示在“项目属性页”对话框中当心:如果您在对话框中修改任何设置,将触发VS重新加载(重新分析)数据,并将再次将其弄乱。

有没有理由不使用App.config/Web.config文件存储项目连接字符串?您确定可以在命令行中使用此类特殊字符?即使被引用,这也不是通常在命令行中传递的类型,因此如果在这样做时遇到问题,我并不感到惊讶。至于更改原因:可能是因为VS编写了XML来保存它,而编写XML持久性代码是为了将MSBuild命名空间添加到XML中。@Jontas:因为它必须在运行前动态传递给应用程序。@Adriano Repetti:是的,我已经在生产环境中对它进行了测试,并且工作正常。
"<AppParameters xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><ConnectionString>Server=localhost;Database=MyDB;User Id=sa;Password=YouNameIt</ConnectionString></AppParameters>"
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LocalDebuggerCommand>E:\WinOBT\1.0.0.0\OPSWpython\2.7.10\x64_d\python_d.exe</LocalDebuggerCommand>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LocalDebuggerCommandArguments>-c "import _xmlrpc as _x;print _x.decode('<value><string>aaa</string></value>')"</LocalDebuggerCommandArguments>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    </PropertyGroup>
</Project>
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LocalDebuggerCommand>E:\WinOBT\1.0.0.0\OPSWpython\2.7.10\x64_d\python_d.exe</LocalDebuggerCommand>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LocalDebuggerCommandArguments><![CDATA[-c "import _xmlrpc as _x;print _x.decode('<value><string>aaa</string></value>')"]]></LocalDebuggerCommandArguments>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
        <LocalDebuggerWorkingDirectory>$(OutDir)</LocalDebuggerWorkingDirectory>
    </PropertyGroup>
</Project>