将我的项目从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自由改变的东西被改变了;深入研究确切的变化可能是浪费时间,因为你不能依赖于你的调查结果。 –