我为Exchange 2010管理编写了一个cmdlet。所以我需要在Exchange 2010服务器上调试它。 我在虚拟机上启动了Exchange 2010(我在VS2012上启动了)。
我的调试计划如下。作为构建后操作,我设置了以下内容:
cmd.exe /c copy $(TargetPath) \\test-exch2010-1\c$\temp /y
作为运行命令,我设置如下:
Start external command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Command line arguments: -NoExit -Command "Import-Module C:\Temp\ExchMgmt.dll"
当我运行项目时,Powershell使用适当的命令在目标服务器上运行。但是当我运行cmdlet时,根本没有断点。
如果我以相同的方式构建项目,然后手动在目标服务器上运行Powershell,导入模块然后将VS2012附加到powershell.exe进程,则成功命中所有断点。虽然有时会发生同样的问题
Exch2010服务器在域中,VS2012计算机不在。我使用域中唯一的帐户进行连接,这是一切的管理员:-)此外,我已经明确许可此用户调试SecPol中的程序。
另外我试图调试这个项目是VS2010。在那里,我收到一条消息:“以下模块是在启用优化或没有调试信息的情况下构建的”。
我仔细检查了项目设置:
- 禁用优化代码
- 调试信息已满
- 生成PDB文件
我深入研究了类似的主题,发现禁用Just My Code设置会有所帮助。我尝试了这个,但在我的情况下没有帮助
我注意到System.Data.dll具有不同平台目标的警告(我使用x64。这可能是一个原因)。由于我没有使用这个程序集,我从引用列表中删除了它。之后,我注意到在运行项目时没有任何变化。但是当我将调试器附加到远程计算机上运行的powershell.exe进程并加载了我的模块时,我看到调试日志说明如下:
'powershell.exe' (CLR v2.0.50727: DefaultDomain): Loaded 'C:\temp\ExchMgmt.dll'. Cannot find or open the PDB file.
但是我确保将DLL和PDB文件都复制到远程计算机。 我检查了加载的模块(Debug - > Windows - > Modules),发现我的模块没有加载调试符号。当我打开符号加载信息窗口时,我发现了以下条目:
d:\Projects\ExchMgmt\ExchMgmt\obj\x64\Debug\ExchMgmt.pdb: PDB does not match image.
我检查过powershell.exe进程是x64。但我也注意到它说CLR是2.0.50727。不确定它是否正确,因为我的模块的目标框架是3.5
答案 0 :(得分:0)
我提出了一个解决方案here
<?xml version ="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727" />
<!-- where 2.0.50727 is the version I read above, tweak if necessary -->
</startup>
</configuration>
我设置了第一个版本3.5,我希望它与构建的程序集匹配。但是后来我在VS2012中遇到错误,powershell.exe平台比VS2012运行的新版本更新。所以我把它设置为2.0.50727,现在它工作正常: - )