VS2012 link.exe是从命令行运行的,而不是从C#的System.Diagnostics.Process运行的?

时间:2013-08-21 22:13:34

标签: c# process linker

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

2 个答案:

答案 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(或两者)中将该路径添加到您的环境中,然后重试。