我试图从C#程序运行VS2012附带的链接器,但是我收到错误,说链接器运行时缺少mspdb110.dll。为什么从C#进程运行exe导致此问题?它从命令行(到处都是!)工作正常。下面是一大堆代码,它完全按预期工作,但link.exe抱怨。我不想尝试任何花哨的过程操作,我只是想用一个参数来启动它。所以问题是C#正在做什么来防止link.exe找到一个dll。其次,为什么link.exe需要这个与调试相关的dll才能运行?最后,我该如何解决这个问题呢?哦,只是为了清楚地说明是link.exe提供了错误,没有别的。
private void buildButton_Click(object sender, EventArgs e)
{
string linkerPath = null;
if (File.Exists((linkerPath = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86) +
"\\Microsoft Visual Studio 11.0\\VC\\bin\\link.exe")))
{
ProcessStartInfo linkInfo = new ProcessStartInfo(linkerPath);
linkInfo.Arguments = "/subsystem:" + subsystemComboBox.Text + " ";
//node.Text is the full file path
foreach (TreeNode node in treeNodes.CSArray)
{
linkInfo.Arguments += "\"" + node.Text + "\" ";
}
linkInfo.Arguments += librariesRichTextBox.Text;
//complete example arg string: /subsystem:console "C:\testdir\test.obj" msvcrt.lib
try
{
Process linkProcess = Process.Start(linkInfo);
linkProcess.WaitForExit();
linkProcess.Close();
}
catch (Exception err)
{
MessageBox.Show(err.Message, "Error!!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("the VS linker wasnt found!");
}
}
答案 0 :(得分:3)
我想这可以归结为工作目录,当你从应用程序调用进程时,使用的工作目录来自应用程序的起始位置,即bin/debug
。
命令行很可能是从dll所在的本地位置打开它。
因此,您的应用程序将在bin/debug
中查找dll而不是正确的目录
您可以通过ProcessStartInfo
...
var linkerPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
"\\Microsoft Visual Studio 11.0\\VC\\bin\\link.exe");
ProcessStartInfo startInfo = new ProcessStartInfo {
FileName = linkerPath,
WorkingDirectory = Path.GetDirectoryName(linkerPath)};
Process p = new Process{
StartInfo = startInfo};
答案 1 :(得分:1)
快速实验似乎表明答案将在您的环境变量中找到。
从内部,Visual Studio中选择工具>> Visual Studio 20xx命令提示符。
在该命令窗口中键入LINK命令。链接器将显示其通常的“可以告诉我要做的事情列表。”
键入SET命令并检查环境变量。将SET输出重定向到文本文件以供以后参考。现在转到违规程序的正常运行时环境。将SET的输出与您保存的输出进行比较。
消除那些相同的东西,剩下的一个值就是你寻求的魔力。
例如,在我自己的机器上,我正在运行VS 2008,我发现这样的值:
Path=c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN;c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools;c:\Windows\Microsoft.NET\Framework\v3.5;c:\Windows\Microsoft.NET\Framework\v2.0.50727;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\VCPackages;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Programs\Vim\Vim73\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\
VSINSTALLDIR=c:\Program Files (x86)\Microsoft Visual Studio 9.0
WindowsSdkDir=C:\Program Files\Microsoft SDKs\Windows\v6.0A\
_ACP_ATLPROV=c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Bin\ATLProv.dll
_ACP_INCLUDE=c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include;C:\Program Files\Microsoft SDKs\Windows\v6.0A\\include;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include
_ACP_LIB=c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\lib;c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\lib\i386;C:\Program Files\Microsoft SDKs\Windows\v6.0A\\lib;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib;C:\Program Files (x86)\Microsoft Visual Studio 9.0\;C:\Program Files (x86)\Microsoft Visual Studio 9.0\lib
_ACP_PATH=c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin;C:\Program Files\Microsoft SDKs\Windows\v6.0A\\bin;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\bin;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\tools;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\ide;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Windows\Microsoft.NET\Framework\v2.0.50727;C:\Program Files (x86)\Microsoft Visual Studio 9.0\;C:\WINDOWS\SysWow64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\
我的mspdb80.dll文件(VS 2008)可以在两个目录中找到,
C:\Program Files (x86)\Common Files\microsoft shared\VSA\9.0\VsaEnv\mspdb80.dll
C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\mspdb80.dll
在我的“普通”环境变量中,哪个路径都没有出现,但在我的VS dev环境中,... \ Common7 \ IDE \文件夹出现在PATH和_ACP_PATH中。
从正常环境运行链接器=失败。
从dev环境=成功运行链接器。
建议:找到您的mspdb10.dll文件,在PATH或_ACP_PATH(或两者)中将该路径添加到您的环境中,然后重试。