【问题标题】:Visual Studio changes debug xml Command line argumentsVisual Studio 更改调试 xml 命令行参数
【发布时间】:2014-08-23 06:48:57
【问题描述】:

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

"<AppParameters><ConnectionString>Server=localhost;Database=MyDB;User Id=sa;Password=YouNameIt</ConnectionString></AppParameters>"

然后您阅读以下几行

DataSet parameter = new DataSet();
parameter.ReadXml(new StringReader(xmlParameter));

一切都很好!

然后你重启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>"

Visual Studio 已更改命令行参数。

为什么?!

【问题讨论】:

  • 有什么理由不使用项目的App.config/Web.config文件来存储连接字符串?
  • 确定你可以在命令行中使用这些特殊字符吗?即使引用?
  • 这不是您通常在命令行中传递的类型,因此如果您在这样做时遇到问题,我并不感到惊讶。至于为什么改:可能是因为VS写了XML来保存,写XML持久化代码是为了给XML添加MSBuild命名空间。
  • @Jontatas:因为它必须在运行前动态传递给应用程序。
  • @Adriano Repetti:是的,我已经在生产环境中对其进行了测试,并且运行良好。

标签: xml visual-studio command-line-arguments


【解决方案1】:

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

  • 我正在使用 VS2k10

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

在打开解决方案的同时,我首先删除了 VUF。打开 Project Property Pages 对话框,默认值在那里:

  • 命令$(TargetPath)

  • CommandArguments

同时生成了 VUF(我什至不必关闭对话框)。这是它的内容(注意命名空间):

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>

然后我填充了上述字段(不要介意值):

  • 命令E:\WinOBT\1.0.0.0\OPSWpython\2.7.10\x64_d\python_d.exe

  • CommandArguments-c "import _xmlrpc as _x;print _x.decode('&lt;value&gt;&lt;string&gt;aaa&lt;/string&gt;&lt;/value&gt;')"

关闭对话框后(或按应用),VUF内容变为:

<?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>

CommandArguments 变为:-c "import _xmlrpc as _x;print _x.decode('&lt;value xmlns="http://schemas.microsoft.com/developer/msbuild/2003"&gt;&lt;string&gt;aaa&lt;/string&gt;&lt;/value&gt;')"

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

所以,我们在 xml(项目设置)中有一个 xml(我们希望将其存储为纯文本),这有点混淆 VS 的解析器尝试解析它时,会产生我认为很奇怪的行为:

  • 如果成功:

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

    • 它将按照我们在对话框中传递的方式存储(它会正确地将其作为参数传递给正在调试的可执行文件)
    • 它将转义 VUF 中的 xml 特殊字符

在我转了一圈之后,我找到了一种方法来部分克服这个问题(这是一个蹩脚的解决方法 - 或增益):

  • 手动修改VUF,把我们的xml变成CDATA section:

    <?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>
    
  • 重新加载解决方案(因为 VS 每次打开对话框时都不会读取 VUF,因为它的内部树没有改变)

现在 xml 字符串已正确传递给可执行文件,并且也正确显示在 Project Property Pages 对话框中。 注意:如果您在对话框中修改任何设置,将触发 VS 重新加载(重新解析)数据,它会再次搞砸。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多