將我的項目從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這個項目的返回類型ServerCacheItem
是CacheItems
下的階級。
如果使用VS 2015執行清理和構建,返回的類型爲ServerCacheItem
是Enquiry
下的類。
我意識到代碼應該是固定的,代碼中存在邏輯錯誤 - 過濾標準應該存在CacheItem
s。 但是我想了解AppDomain.CurrentDomain.GetAssemblies()
的工作方式有何變化?
監視窗口VS 2015年
監視窗口VS 2013
這些類型是否在同一個程序集中?如果是的話,你的問題實際上是在'Assembly.GetTypes()'中改變了什麼(回答:它現在使用了不同的順序,這很好,因爲順序沒有記錄)。如果他們不是,你的問題可能另外是'AppDomain.GetAssemblies()'中改變了什麼(答案:它現在使用了不同的順序,這很好,因爲順序沒有記錄)。無論哪種方式,你切片,MS自由改變的東西被改變了;深入研究確切的變化可能是浪費時間,因爲你不能依賴於你的調查結果。 –