2

カスタム属性が適用されている(単体テストプロジェクト内の)参照されているすべてのアセンブリを取得することは可能ですか?正常に動作するアプリケーションで次のコードを使用します。

var assemblies = System.Web.Compilation.BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();

ただし、System.Web.Compilation.BuildManagerがテストプロジェクトで機能しないため、次のことを試しました。

Assembly.GetExecutingAssembly().GetReferencedAssemblies().Select(a => Assembly.ReflectionOnlyLoad(a.FullName).Where(a => a.GetCustomAttributes(false).OfType<AssemblyCategoryAttribute>().Any()).ToList();

しかし、これはエラーを投げました:

ReflectionOnlyGetTypeを介してロードされたタイプのカスタム属性を反映することは違法です(Assembly.ReflectionOnlyを参照)。代わりにCustomAttributeDataを使用してください。

誰かがこれを行う方法を教えてくれたら幸いです。ありがとう

4

2 に答える 2

5

現在実行中のアセンブリの参照アセンブリを取得しているため、リフレクションのみのロードを実行する理由はありません。 ReflectionOnlyLoadアセンブリを確認したいが、実際には実行したくない場合に使用します。これらのアセンブリは現在実行中のアセンブリによって参照されているため、実行コンテキストにロードされているか、ロードされる可能性があります。

やってみてください:

Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(a => Assembly.Load(a.FullName))
    .Where(a => a.
            .GetCustomAttributes(false)
            .OfType<AssemblyCategoryAttribute>()
            .Any())
    .ToList();

またはさらに良い:

Assembly
    .GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(Assembly.Load)
    .Where(a => a.IsDefined(typeof(AssemblyCategoryAttribute), false))
    .ToList();
于 2012-10-04T20:12:10.717 に答える
2

CustomAttributeDataクラスを見てください

リフレクションのみのコンテキストにロードされるアセンブリ、モジュール、タイプ、メンバー、およびパラメーターのカスタム属性データへのアクセスを提供します。

そこにサンプルのc#コードがあります

public static void Main()
{
    Assembly asm = Assembly.ReflectionOnlyLoad("Source");
    Type t = asm.GetType("Test");
    MethodInfo m = t.GetMethod("TestMethod");
    ParameterInfo[] p = m.GetParameters();

    Console.WriteLine("\r\nAttributes for assembly: '{0}'", asm);
    ShowAttributeData(CustomAttributeData.GetCustomAttributes(asm));
    Console.WriteLine("\r\nAttributes for type: '{0}'", t);
    ShowAttributeData(CustomAttributeData.GetCustomAttributes(t));
    Console.WriteLine("\r\nAttributes for member: '{0}'", m);
    ShowAttributeData(CustomAttributeData.GetCustomAttributes(m));
    Console.WriteLine("\r\nAttributes for parameter: '{0}'", p);
    ShowAttributeData(CustomAttributeData.GetCustomAttributes(p[0]));
}

あなたの場合、このようなものです(自分でコードを試していませんでした):

var assemblies = Assembly.GetExecutingAssembly()
    .GetReferencedAssemblies()
    .Select(a => Assembly.ReflectionOnlyLoad(a.FullName))
    .Select(a => new 
      { Asm = a, 
        CustomAttributeDataList = CustomAttributeData.GetCustomAttributes(a)
      })
    .Where(x => x.CustomAttributeDataList.Any(y => y.AttributeType ==           
         type(AssemblyCategoryAttribute)))
    .Select(x => x.Asm)
    .ToList();
于 2012-10-04T19:48:44.277 に答える