2017-09-06 62 views
19

我有一個.net核心2.0控制檯應用程序,將執行以下操作(簡化):調試代碼在.NET芯動態加載組件2.0

var a = Assembly.Load(Assembly.GetEntryAssembly() 
           .GetReferencedAssemblies() 
           .First(i => i.Name == "MyAssembly")); 

var t = a.GetType("MyType"); 
var i = (MyBaseType)Activator.CreateInstance(t); 

i.Execute(); 

當我通過代碼調試它stepps成MyType.Execute()如預期。

但是如果我加載與下面的代碼的程序集:

var path = new FileInfo(Assembly.GetExecutingAssembly().Location); 
var a = Assembly.LoadFile(Path.Combine(path.DirectoryName, "MyAssembly.dll")); 

的代碼仍然有效,但我不能踏進MyType.Execute()同時調試。

任何想法爲什麼/有什麼問題?

+0

也許只是我的代碼選項應該被禁用? https://blogs.msdn.microsoft.com/zainnab/2010/10/25/understanding-just-my-code/ – Alexan

+0

您需要確保.pdb文件與您正在加載的dll位於相同的位置。然後Visual Studio將加載該數據,並允許它停在斷點處。 – codeSetter

回答

3

您是否檢查選項just my code

enter image description here

啓用僅我的代碼

(「我的代碼」)只,忽略系統代碼和其它代碼, 優化或沒有調試symbols.The調試顯示器和步驟進入用戶代碼

也許它應該取消選中?

7

這可能是由於應用程序無法找到與MyAssembly程序集關聯的PDB文件,如其中一條註釋中所述。但是,似乎PDB文件不需要與程序集在同一文件夾中進行調試工作。

爲了檢查是否加載符號,請把在該行斷點只是打電話Assembly.LoadFile()和開放後模塊窗口(它可以在在Visual Studio調試\ Windows下菜單中找到)。在此窗口中,找到MyAssembly程序集並驗證值爲符號狀態列。如果丟失PDB是原因,則值將爲「找不到或打開PDB文件。」「。您也可以使用該窗口來查看調試器試圖找到符號文件的位置。

調試器在多個位置查找PDB文件,如下所述: Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger

根據這篇文章,對於PDB文件的默認位置是:該組件本身內指定(通過接頭放置在那裏當組件被編譯)

  1. 位置
  2. 文件夾,其中動態加載集駐留
  3. 本地符號緩存文件夾
  4. 互聯網,網絡或本地符號服務器

我想在你的情況下,應考慮提到的第一個或第二個位置。

另一個需要注意的地方是,PDB必須與程序集完全匹配,因此在重新編譯程序集之後,還應該更新PDB文件以匹配新版本。

如果PDB文件與程序集相匹配並駐留在上述位置之一中,則應該能夠調試代碼。

可能還有其他原因,這與使用.NET Core的事實沒有直接關係,但我認爲正確的PDB加載可能值得驗證。

+0

嗨Lukasz。感謝您的回答。在我的情況下,模塊不幸被加載。 – gsharp

+0

通過「模塊加載」,您指的是爲這個動態加載的程序集在模塊窗口中顯示的加載符號,我正確嗎? –

+0

是的,抱歉,這就是我的意思。 – gsharp

3

我同意Lukasz和Alexan的解答。如果你已經檢查過這些,那麼你代碼示例不同的原因可能是它們不加載相同的程序集。

正在執行的組件和入口組件不總是相同的組件,所以路徑可能不同。也可能是加載了另一個版本的程序集,例如來自GAC。在Visual Studio中使用模塊窗口可以看到哪個dll被加載。如果存在正確的PDB並且只是我的代碼被關閉,您應該能夠進入它。

+0

@MathijsFlietstra:我的帖子提供了一個解釋,爲什麼兩個例子可能表現不同。從這個意義上說,我相信我的答案除了知道什麼是錯誤外,還有其他用處,這在Lukasz的回答中已經提到。 – Herman

1

有一個'Assembly.Load'覆蓋,它將PDB數據作爲參數。您需要明確加載調試符號。

入住此SO職位:Debug dynamically loaded assembly

還檢查了這個MSDN上:https://msdn.microsoft.com/en-us/library/twt16z2x(v=vs.110).aspx

希望這有助於如果你使用Assembly.LoadFile方式

+0

但是,只有當我從一個字節數組加載時才需要,或者我錯了嗎? – gsharp

+0

您可以將任何文件加載爲字節數組。 'System.IO.File.ReadAllBytes(string path)' - 對嗎? –

1

您的代碼將無法編譯。

我在Visual Studio 2017社區創建了一個示例項目,我能夠通過使用Assembly.LoadFileAssembly.Load兩種方式從動態裝配中進入功能。由於沒有編譯代碼,我沒有和你一起去,但我會提供一個解決方案,我認爲你會解決你的問題。

這裏是解決方案: 完全可行的解決方案是在這裏 https://github.com/beyazc/.netcore-dynamic-assembly-debug

Basicly我能喲調試與下面的代碼。你應該在調用方法上按f11

var assemlies = Assembly.GetEntryAssembly().GetReferencedAssemblies(); 
     var assemblyName = ""; 
     foreach (var item in assemlies) 
     { 
      if (item.Name == "RefProj") 
       assemblyName = item.Name; 

     } 
     var path = new FileInfo(Assembly.GetExecutingAssembly().Location); 
     var a = Assembly.LoadFile(Path.Combine([email protected]"{path}\..\..\..\..\..\RefProj\bin\Debug\netstandard2.0", "RefProj.dll")); 
     var t = a.GetType("RefProj.Class1"); 

     var i = Activator.CreateInstance(t); 
     MethodInfo mi = t.GetMethod("get1"); 
     mi.Invoke(i, null);