我需要一个接受Type的方法,并返回该类型中使用的所有程序集的路径。 我写了这个:
public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type)
{
yield return type.Assembly.Location;
foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())
{
yield return Assembly.Load(assemblyName).Location;
}
}
通常这种方法可以胜任,但也有一些缺点:
我没有找到如何从类型本身获取引用的程序集/类型,所以我使用了type.Assembly.GetReferencedAssemblies()并获得了整个程序集的引用,而不仅仅是那些与类型。
type.Assembly.GetReferencedAssemblies()返回AssemblyName,没有location / path / filepath属性。要获取location属性,我首先使用Assembly.Load()然后使用location属性。我不希望加载程序集获取它们的路径,因为它们没有必要使用,并且因为Assembly.Load()可能因FileNotFoundException或BadImageFormatException而失败。
答案 0 :(得分:9)
我认为我通过将其替换为Assembly.ReflectionOnlyLoad()解决了Assembly.Load()问题。
现在这就是我的方法的样子:
public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type)
{
yield return type.Assembly.Location;
foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())
{
yield return Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location;
}
}
现在唯一剩下的问题是type.Assembly.GetReferencedAssemblies(),我如何从类型而不是从程序集中获取引用的程序集?
答案 1 :(得分:2)
type.Assembly.GetReferencedAssemblies()
将返回声明类型的程序集引用的所有程序集。这并不意味着您将使用此函数获得的程序集与给定类型有任何共同之处。