[英].net load latest version of assembly
我有一個引用Microsoft.SqlServer.Smo程序集的.net應用程序。 程序集不隨應用程序一起分發。 而是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.