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

3

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

由于我的应用程序的结构,我必须提供一些机制来帮助应用程序加载程序集(如这篇知识库文章所述)
该文章有一种有趣的方法来确定加载的程序集是否符合要求。

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个回答

2

我建议您查看 AssemblyName 类。您可以通过 AssemblyName(string) 构造函数从完整或部分程序集名称创建对象,并通过 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;

2

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; 
} 

1

您可能希望使用 AssemblyName.ReferenceMatchesDefinition

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

感谢 @Oliver 提供的示例。 - Robert Cutajar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接