2016-11-08 57 views
1

我有一個主要的應用程序從他們編譯的DLL文件加載驅動程序。我遇到了一個問題,我希望能夠調試這些dll文件,但符號不會被項目加載。無法加載DLL的符號在C#項目

dll文件是解決方案的一部分,但必須與主應用程序分開構建。然後,主應用程序在運行時從目錄加載這些dll。我在其中一個加載的dll文件中出現錯誤(不是一個例外,只是意外的結果),但無法調試這些文件。任何人都可以給我一個關於如何繼續調試這些的想法嗎?

編輯: 舉的DLL是怎麼會在這裏裝是從主項目中的代碼更好的主意:

public List<BaseClass> getObjects(string objectName) 
{ 
    List<BaseClass> availableDrivers = new List<BaseClass>(); 

    string currentDir = Directory.GetCurrentDirectory(); 
    currentDir = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath); //Use this to find path even when running as service 

    if (Directory.Exists(currentDir + "\\Objects")) 
    { 
     string[] files = Directory.GetFiles(currentDir + "\\Objects", "*.dll"); 
     foreach (string file in files) 
     { 
      Console.WriteLine("LOOKING AT:"+ file); 
      try 
      { 
       Assembly dll = Assembly.LoadFrom(file); 
       Type[] types = dll.GetTypes(); // .Where(x => x.BaseType.Name == "BaseClass"); 
       foreach (Type type in types) 
       { 

        if (type.BaseType != null && (type.BaseType.Name == "BaseClass" || type.BaseType.Name == "PeriodicBaseClass")) 
        { 
         BaseClass ClassObj = (BaseClass)Activator.CreateInstance(type); 

         if (objectName == "" || objectsName == ClassObj.Name) 
         { 
          availableDrivers.Add(ClassObj); 
         } 
        } 
       } 
      } 
      catch (Exception e) 
      { 
       Error.Log("Error reading driver:" + e.Message,MessageType.Error); 
       //Console.WriteLine("Error reading driver:" + e.Message); 
      } 
     } 
    } 
    return availableDrivers; 
} 

所以你可以看到,當我運行該程序本身的驅動程序得到加載通過檢索他們編譯的dll文件,並在dll代碼中添加斷點時,我會收到消息,指出符號無法加載。我曾嘗試檢查調試> Windows>模塊,但由於未直接在應用程序中加載,dll不顯示在那裏。

+0

是否有任何幫助[文檔](https://msdn.microsoft.com/library/ms241613)?如果沒有,具體是什麼是你的問題?獲得.pdb的?讓他們加載?調試沒有.pdb的? –

+0

假設Visual Studio,在'Modules'窗口中,右鍵單擊您在調試時遇到問題的dll,並選擇'Symbol load information ...'選項。這應該給你一個想法,爲什麼符號沒有被加載(也許你已經啓用了「Just My Code」選項?)。也可以選擇「加載符號」,以便手動指定pdb文件。 – cynic

+0

@Resistance,這是什麼dll文件,自定義類庫或其他?請確保您在工具 - >選項 - >調試 - >符號下啓用符號服務器。另外,你真的在​​你的項目中添加這個dll文件作爲參考嗎?如果將其添加爲參考,請設置屬性「copy local = true」。 –

回答

0

所以我最終解決了這個問題。我這樣做的方式是在解決方案中創建一個小型控制檯應用程序,該應用程序運行與主應用程序相同的方法,但是直接來自解決方案中的項目,而不是動態加載dll。

然後我將啓動項目設置爲控制檯應用程序,並能夠正確地瀏覽相關文件。

0

如果有問題的dll是調試版本(即它們是爲了調試而編譯的),並且它們當前的.pdb文件位於同一個目錄中,那麼應該能夠像遍歷它們一樣遍歷它們項目。

另一種替代方法是打開生成這些DLL的解決方案,並通過附加到正在運行的程序的進程中進行調試。

https://msdn.microsoft.com/en-us/library/3s68z0b3.aspx