如何确定程序集名称是否与请求的部分程序集名称匹配

时间:2012-01-09 16:55:47

标签: c# .net

在我的应用程序中,我想测试给定的程序集列表中的任何条目是否符合请求的程序集名称。

由于我的应用程序的结构,我必须提供一些机制来帮助应用程序加载程序集(如this knowledge base article中所述。) 本文有一种有趣的方法来确定加载的程序集是否符合请求。

if(strAssmbName.FullName.Substring(0, strAssmbName.FullName.IndexOf(","))==args.Name.Substring(0, args.Name.IndexOf(",")))

当提供的程序集名称只是名称时,这种方法会给我带来问题,因为args.Name不包含,

private Assembly CurrentDomainAssemblyResolve( object sender, ResolveEventArgs args ) {
  foreach( Assembly pluginAssembly in LoadedPluginAssemblies ) {
    if( pluginAssembly.FullName.Substring( 0, pluginAssembly.FullName.IndexOf( "," ) ) == args.Name.Substring( 0, args.Name.IndexOf( "," ) ) ) {
      return pluginAssembly;
    }
  }
  return null;
}

作品

MyApp.JobDetails, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

ArgumentOutOfRangeException

MyApp.JobDetails

显然,我可以优化字符串匹配,直到它按照我需要的方式工作,但是不是有更好的方法来处理它吗?我怎么知道给定的集合何时是有效的匹配?

3 个答案:

答案 0 :(得分:2)

我会看一下AssemblyName课程。您可以通过AssemblyName(string)c'tor从完整或部分程序集名称创建对象,并通过Name属性进行比较。

    AssemblyName partial = new AssemblyName("MyApp.JobDetails");
    AssemblyName full = new AssemblyName("MyApp.JobDetails, Version=1.0.0.2001, Culture=en-US, PublicToken=null");
    bool isMatch = String.Compare(partial.Name, full.Name, StringComparison.OrdinalIgnoreCase) == 0;

答案 1 :(得分:1)

如果未找到匹配项,则

String.IndexOf返回-1。请改用String.Split

private Assembly CurrentDomainAssemblyResolve( object sender, ResolveEventArgs args ) { 
    foreach( Assembly pluginAssembly in LoadedPluginAssemblies ) { 
        if( pluginAssembly.FullName.Split(',')[0] == args.Name.Split(',')[0]) { 
            return pluginAssembly; 
        } 
    } 
    return null; 
} 

答案 2 :(得分:1)

您可能想要使用AssemblyName.ReferenceMatchesDefinition

AssemblyName name = new AssemblyName( args.Name );
foreach( Assembly pluginAssembly in LoadedPluginAssemblies ) {
  if( AssemblyName.ReferenceMatchesDefinition( name, pluginAssembly.GetName() ) ) 
    return pluginAssembly;
}