簡體   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