繁体   English   中英

.net加载最新版本的程序集

[英].net load latest version of assembly

我有一个引用Microsoft.SqlServer.Smo程序集的.n​​et应用程序。 程序集不随应用程序一起分发。 而是sql sdk安装在系统中,并且dll在GAC中注册,以便应用程序可以加载。 这没有问题,除了在某些目标机器上我有SDK的v12,而在其他目标机器上我有SDK的v13(通常安装了SSMS)。 我希望应用程序加载系统上可用的任何内容的最新版本,因此v13或v12(如果不可用)。 是否可以在代码中或通过应用程序配置实现此目的?

简短的回答这个问题是SpecificVersion设置为false作为正确地@sevzas建议。

无论如何,如果在系统上安装了SSMS 2016更新13.0.16000.28,那么dll的13.100.0.0将在GAC中注册,并且通过上述更改,这是它将被加载的版本。 不幸的是,这个版本不是由第三方开发人员使用,而是仅由Microsoft产品使用,因此尝试加载它将产生异常( 参见此处 )。 有人可能想知道为什么如果他们不希望人们使用它,他们会在GAC注册它。

无论如何,我找到了一种方法,通过使用程序集解析事件,使用以下代码加载v13.0(或之前或未来14)。

    static int Main(string[] args)
    {
        //we set an event handler at the begging of our program
        AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        //your stuff
    }

    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        //if the dll is a sqlserver dll, we do our trick
        if(args.Name.StartsWith("Microsoft.SqlServer"))
            return LoadSqlAssembly(args.Name);

        return null;
    }

    private static readonly int[] SqlVersions = new int[] {14, 13, 12, 11};

    private static bool _reEntry = false;

    private static Assembly LoadSqlAssembly(string name)
    {
        if (_reEntry)
            return null;

        name = name.Split(',')[0];

        foreach (var version in SqlVersions)
        {
            try
            {
                _reEntry = true;
                var ret = Assembly.Load($"{name}, Version={version}.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL");
                //Logger.InfoFormat("Loaded {0} version {1}", name, version);
                return ret;
            }
            catch (Exception)
            {
                //ignore exception
            }
            finally
            {
                _reEntry = false;
            }
        }

        return null;
    }

```

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM