C# 获取类型中使用的程序集的路径

C# 获取类型中使用的程序集的路径,c#,.net,reflection,assemblies,reference,C#,.net,Reflection,Assemblies,Reference,我需要一个方法,它接受一个类型并返回该类型中使用的所有程序集的路径。 我写道: public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type) { yield return type.Assembly.Location; foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())

我需要一个方法,它接受一个类型并返回该类型中使用的所有程序集的路径。 我写道:

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;
 }
}
public静态IEnumerable GetReferencesAssembliesPath(此类型)
{   
退货类型.装配.位置;
foreach(类型为.Assembly.GetReferencedAssemblys()中的AssemblyName AssemblyName)
{
屈服返回程序集。加载(程序集名称)。位置;
}
}
一般来说,这种方法可以完成这项工作,但也有一些缺点:

  • 我没有找到如何从类型本身获取引用的程序集/类型,因此我使用type.Assembly.getReferenceAssemblys()并获取整个程序集的引用,而不仅仅是与类型相关的引用

  • type.Assembly.getReferencedAssemblys()返回AssemblyName,并且没有location/path/filepath属性。为了获得location属性,我首先使用Assembly.Load(),然后使用location属性。我不希望load程序集获取其路径,因为它们不需要使用,而且Assembly.load()可能会因FileNotFoundException或BadImageFormatException而失败


type.Assembly.getReferencedAssemblys()将返回声明类型的程序集引用的所有程序集。这并不意味着使用此函数获得的程序集与给定类型有任何共同之处。

我想我解决了Assembly.Load()问题,将其替换为Assembly.ReflectionOnlyLoad()

现在,我的方法是这样的:

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;
    }
}
public静态IEnumerable GetReferencesAssembliesPath(此类型)
{           
退货类型.装配.位置;
foreach(类型为.Assembly.GetReferencedAssemblys()中的AssemblyName AssemblyName)
{
屈服返回Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location;
}
}

现在唯一剩下的问题是type.Assembly.getReferencedAssemblys(),如何从类型而不是从程序集获取引用的程序集?

所有类型都属于程序集--您应该能够只执行type.Assembly.getReferencedAssemblys()。哦,等等,你已经这么做了。我想这个问题早就解决了,对吧?2011年?@DxCK关于这个问题有什么解决办法吗?我的问题:我的库项目引用了Oracle.DataAccess 4.112.2.0,但在执行时,从GAC Oracle.DataAccess 4.121.1.0加载。Assembly.GetReferenceAssemblys()为我提供Oracle.DataAccess 4.112.2.0而不是Oracle.DataAccess 4.121.1.0。若要使用,请调用
var results=this.GetType().GetReferencesAssemblyesPath()问题:库项目引用Oracle.DataAccess 4.112.2.0,但在执行时,从GAC Oracle.DataAccess 4.121.1.0加载。Assembly.getReferenceAssemblys()为我提供Oracle.DataAccess 4.112.2.0,而不是Oracle.DataAccess 4.121.1.0。