2016-04-28 178 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的程序集。

相关问题