2013-08-21 106 views
0

我試圖從一個C#程序運行VS2012附帶的鏈接器,但我得到一個錯誤,說當鏈接器運行時mspdb110.dll丟失。爲什麼從C#進程中運行exe導致這個問題?它從命令行(從其他地方到!)工作正常。下面是一段代碼,它的工作原理與預期完全相同,但link.exe抱怨。我不想做任何奇特的流程操作,我只想用一個參數開始。所以問題在於C#阻止link.exe找到dll。其次,爲什麼link.exe需要這個調試相關的DLL來運行?最後,我應該如何解決這個問題?哦,只是爲了弄清楚它是給出錯誤的link.exe,沒有別的。VS2012 link.exe從命令行運行,但不是從C#的System.Diagnostics.Process運行?

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!"); 
     } 
    } 

回答

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}; 
+0

工作,如果工作目錄設置爲 「C:\ Program Files文件(x86)的\微軟的Visual Studio 11.0 \ Common7 \ IDE」,這是該dll是。現在我只需要弄清楚鏈接器是如何處理可執行文件的,即使鏈接器沒有提供任何錯誤,也無處可尋。 – kbzombie

+0

大多數程序傾向於將它們粘貼在文件來自的目錄或工作目錄 – Sayse

+0

無處可尋,它們不存在。我不知道發生了什麼事?鏈接器沒有提供任何錯誤。 – kbzombie

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 

路徑出現在我的「正常」環境變量的任何地方,但... \ Common7 \ IDE \文件夾中同時出現在PATH和_ACP_PATH在我的VS開發環境。

從正常環境運行鏈接器=失敗。

從dev environment = success運行鏈接器。

建議:找到您的mspdb10.dll文件,將該路徑添加到您的環境,無論是在PATH中還是在_ACP_PATH(或兩者)中,然後重試。


相關問題