2016-04-28 181 views
0

將我的項目從VS 2013遷移到VS 2015之後 - 我遇到了一些對象引用錯誤。AppDomain.CurrentDomain.GetAssemblies()發生了哪些變化?SelectMany()?

我將通過一個例子來識別問題。

我有兩個類,同名StatusList - 它們在不同的命名空間下。

namespace TestNS.Interop.Cache.CacheItems 
{ 
    public class StatusList 
    { 
     public string Message { get; set; } 
     public StatusList() 
     { 
      Message = "I am a cache statuslist"; 
     } 
    } 
} 

namespace TestNS.Interop.Enquiry 
{ 
    public class StatusList 
    { 
     public string Message { get; set; } 
     public StatusList() 
     { 
      Message = "I am an enquiry statuslist"; 
     } 
    } 
} 

主程序進行調用以AppDomain.CurrentDomain.GetAssemblies()並尋找第一StatusList

var manyitems = AppDomain.CurrentDomain.GetAssemblies().SelectMany(o => o.GetTypes()); 
var typeServerCacheItem = manyitems.FirstOrDefault(o => o.Name == name); 


class Program 
{ 
    static void Main(string[] args) 
    { 
     PrintMessagefromAssembly(); 
    } 


    private static void PrintMessagefromAssembly() 
    { 
     const string name = "StatusList"; 

     var manyitems = AppDomain.CurrentDomain.GetAssemblies().SelectMany(o => o.GetTypes()); 
     var typeServerCacheItem = manyitems.FirstOrDefault(o => o.Name == name); 

     if (typeServerCacheItem == null) 
     { 
      Console.WriteLine("No item found"); 
      return; 
     } 

     Console.WriteLine(typeServerCacheItem.FullName); 
     Console.ReadKey(); 

    } 
} 

如果執行清理並生成使用VS2013這個項目的返回類型ServerCacheItemCacheItems下的階級​​。

如果使用VS 2015執行清理和構建,返回的類型爲ServerCacheItemEnquiry下的類。

我意識到代碼應該是固定的,代碼中存在邏輯錯誤 - 過濾標準應該存在CacheItem s。 但是我想了解AppDomain.CurrentDomain.GetAssemblies()的工作方式有何變化?

Breakpoint and Order VS 2015

監視窗口VS 2015年

Break point and Order VS 2013

監視窗口VS 2013

+0

這些類型是否在同一個程序集中?如果是的話,你的問題實際上是在'Assembly.GetTypes()'中改變了什麼(回答:它現在使用了不同的順序,這很好,因爲順序沒有記錄)。如果他們不是,你的問題可能另外是'AppDomain.GetAssemblies()'中改變了什麼(答案:它現在使用了不同的順序,這很好,因爲順序沒有記錄)。無論哪種方式,你切片,MS自由改變的東西被改變了;深入研究確切的變化可能是浪費時間,因爲你不能依賴於你的調查結果。 –

回答

1

由於過濾器僅指定SHORTNAME你的類型的「StatusList」,也你應該指定命名空間,例如FullNameFirstOrDefault()不保證你會採取完全想要的類型與另一個。在這種情況下,你不能希望你會得到完全想要的類型。

var typeServerCacheItem = manyitems 
.FirstOrDefault(o => o.Name == name && o.Namespace == namespace); 

關於在VS2015的變化,是的,可能是他們發生的事情,但他們不能保證結果集的你順序,你應該把它放在自己的

1

你已經做了假設有關的排序由GetTypes返回的對象,但未在MSDN文檔中定義。這意味着不能保證第一個項目總是相同的。在獲取第一個項目之前,您需要首先對數組進行排序(例如,在命名空間中)。

+0

Jeroen,Slava和Polyfun - 感謝您的回覆。我爲這個問題添加了一些圖片。換句話說,這個代碼已經在爲驢年製作。僅僅因爲我認爲我應該用新的VS 2015而不是VS 2013來開發和構建項目 - 我們必須對代碼進行「更正」。這對於商業用戶來說將是一個難以推銷的事情,並且讓人想知道還有哪些可能發生了變化。 – Raj

+0

@Raj:如果你從早期版本移植到.NET 4.6或4.5,那麼「Lots」就是答案,這是你的實際問題,而不是Visual Studio。你的牛肉是運行時的,而不是編譯器。如果您注意確定正確的運行時間(如有必要,則強制執行此操作),您仍然可以使用VS 2015進行開發和編譯。但這是另一個問題的主題。 –

0

要回答這個問題,正確的方法是過濾cacheitem的程序集。

相關問題