[英]How to load an assembly from GAC with wildcards in version number
在我们的应用程序中,我们需要动态加载第三方程序集,而我们事先不知道所有已发布的程序集版本号。 例如,我们所知道的是程序集的主要版本号必须为“ 12”。 在PC上,可以安装同一组件的多个版本,同时具有较高和较低的主要版本号。
即我们需要类似的东西
Assembly myAssembly = Assembly.Load("SampleAssembly, Version=12.*.*.*");
如果安装了程序集版本11.1.2.3、12.7.6.5和13.9.8.7,则应加载版本12.7.6.5。
即,应该可以为版本号组件指定通配符,还可以省略Culture
和PublicKeyToken
。 当我们使用Assembly.Load()
进行此操作时,我们得到一个FileNotFoundException
。
我们不能使用Assembly.LoadWithPartialName()
因为它始终以最高版本号加载程序集,但是我们需要一个特定的主版本号,该主版本号可能小于已安装的最大程序集版本号。
是否有可能做到这一点?
您可以手动列出GAC的内容,并将其与通配符进行比较
class Program
{
static void Main(string[] args)
{
var assemblyName = "SimpleAssembly";
var versionRegex = new Regex(@"^12\.");
var assemblyFile = FindAssemblyFile(assemblyName, versionRegex);
if (assemblyFile == null)
throw new FileNotFoundException();
Assembly.LoadFile(assemblyFile.FullName);
}
static FileInfo FindAssemblyFile(string assemblyName, Regex versionRegex)
{
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "assembly", "GAC_MSIL", assemblyName);
var assemblyDirectory = new DirectoryInfo(path);
foreach (var versionDirectory in assemblyDirectory.GetDirectories())
{
if (versionRegex.IsMatch(versionDirectory.Name))
{
return versionDirectory.GetFiles()[0];
}
}
return null;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.