0

我试图从 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!");
        }
    }
4

2 回答 2

3

我想这取决于工作目录,当您从应用程序调用进程时,使用的工作目录来自应用程序的启动位置,即bin/debug.

命令行很可能会从 dll 所在的本地位置打开它。

因此,您的应用程序将寻找bin/debugdll 而不是正确的目录

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};
于 2013-08-21T22:17:14.943 回答
1

一个快速的实验似乎表明答案将在您的环境变量中找到。

在 Visual Studio 中,选择Tools >> Visual Studio 20xx Command Prompt

在该命令窗口中键入 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

这两个路径都没有出现在我的“正常”环境变量中的任何位置,但 ...\Common7\IDE\ 文件夹出现在我的 VS 开发环境中的 PATH 和 _ACP_PATH 中。

从正常环境运行链接器 = 失败。

从开发环境运行链接器 = 成功。

推荐:找到您的 mspdb10.dll 文件,将该路径添加到您的环境中 PATH 或 _ACP_PATH(或两者),然后重试。


于 2014-01-03T19:00:19.063 回答