2016-04-28 6 views
0

プロジェクトをVS 2013からVS 2015に移行した後、私はいくつかのオブジェクト参照エラーに直面しています。AppDomain.CurrentDomain.GetAssemblies()で何が変更されましたか?SelectMany()?

この例では、問題を特定します。

私は同じ名前のStatusListという2つのクラスを持っています。それらは異なる名前空間の下にあります。

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を探します。あなたはVS2013を使用して、このプロジェクトのためのクリーンを実行してビルドする場合

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(); 

    } 
} 

が返される型ServerCacheItemCacheItems下のクラスです。

VS2015を使用してクリーンビルドを実行する場合は、ServerCacheItemタイプが返されます。クラスはEnquiryです。

コードを修正する必要があります。コードに論理エラーがあります。CacheItemのフィルタ条件が存在する必要があります。 しかし、私はAppDomain.CurrentDomain.GetAssemblies()の仕組みが変わったことを理解しようとしていますか?

Breakpoint and Order VS 2015

ウォッチウィンドウ2015 VS

Break point and Order VS 2013

ウォッチウィンドウVS 2013

+0

これらのタイプは同じアセンブリ内にあるかどうかを確認します。もしそれらがあれば、あなたの質問は本当に 'Assembly.GetTypes()'で変更されたものです(答え:これは現在、注文は文書化されていないので、別の注文を使用しています。もしそうでなければ、あなたの質問は 'AppDomain.GetAssemblies()'で変更されたものかもしれません(答え:これは現在、注文が文書化されていないので、別の注文を使用しています。どちらの方法でスライスしても、MSが自由に変更できるものは変更されました。正確な変更を掘り下げることは、おそらくあなたの調査の結果に依存することができないので時間の無駄です。 –

答えて

1

フィルタとして、あなただけのあなたのタイプの短縮名指定:"StatusList"をするだけでなく、名前空間を指定する必要があります。FullNameFirstOrDefault()は、あなたが望むタイプを別のタイプと正確に区別する保証はありません。あなたは、この場合、あなたが正確に欲しいタイプになることを望んではいけません。 VS2015での変更について

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

あなたがの順序についての仮定を行っている、そう、彼らが起こってもよいが、彼らはセットの結果のあなたの順序を保証してはいけない、あなた自身の

1

にそれを取る必要がありますGetTypesによって返されるオブジェクトですが、これはMSDNのドキュメントでは定義されていません。つまり、最初のアイテムが常に同じであるという保証はありません。最初の項目を取得する前に、配列を最初に(たとえば、名前空間上で)並べ替える必要があります。

+0

Jeroen、Slava、Polyfun - あなたの返信に感謝します。私は質問にいくつかの写真を追加しました。このコードは、ロバの年の間生産されています。 VS 2013ではなく、新しいVS 2015を開発してプロジェクトを構築するためには、コードに「修正」する必要があります。これはビジネスユーザーには大変な売り込みになり、他に何が変わったのか不思議に思う。 – Raj

+0

@Raj:実際の問題ではなく、それほど多くのVisual Studioではなく、以前のバージョンから.NET 4.6または4.5に移行する場合の答えは「Lots」です。あなたのビーフは、コンパイラではなく、ランタイムで動作します。正しいランタイムをターゲットにしている場合(必要に応じてこれを強制する)、VS 2015を使用して開発およびコンパイルすることはできます。しかし、これは別の質問の対象です。 –

0

正しい答えは、キャッシュアイテムのアセンブリをフィルタリングすることです。

関連する問題