我正在调试一个 Python 模块并且遇到了同样的问题。半个多小时我发疯了,但我终于明白了。备注:
在打开解决方案的同时,我首先删除了 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>
然后我填充了上述字段(不要介意值):
关闭对话框后(或按应用),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('<value xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><string>aaa</string></value>')"
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 重新加载(重新解析)数据,它会再次搞砸。