在我的应用程序中,我想测试给定的程序集列表中的任何条目是否符合请求的程序集名称。
由于我的应用程序的结构,我必须提供一些机制来帮助应用程序加载程序集(如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
显然,我可以优化字符串匹配,直到它按照我需要的方式工作,但是不是有更好的方法来处理它吗?我怎么知道给定的集合何时是有效的匹配?
答案 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;
}