Microsoft.SqlServer.Smoアセンブリを参照する.NETアプリケーションがあります。 アセンブリはアプリケーションとともに配布されません。代わりにsql sdkがシステムにインストールされ、dllがGACに登録され、アプリケーションがロードできるようになります。 一部のターゲットマシンではSDKのv12があるのに対し、他のプラットフォームではSDKのv13(通常はSSMSにインストールされています)がある点を除いては問題ありません。 私はシステム上で利用可能なものの最新バージョンを読み込むようにしたいので、v13か、利用できない場合はv12をロードしてください。 これをコードで実行することも、アプリケーションの設定で実行することも可能ですか?.netアセンブリの最新バージョンをロードします。
1
A
答えて
0
質問に対する簡単な答えは、@sevzasが正しく示唆しているように、SpecificVersionをfalseに設定することです。
とにかく、システムにSSMS 2016アップデート13.0.16000.28がインストールされている場合、DLLの13.100.0.0がGACに登録され、上記の変更でロードされるバージョンです。残念ながら、このバージョンはサードパーティの開発者がMicrosoft製品だけで使用するためのものではないため、ロードしようとすると例外(see here)が生成されます。この時点で、なぜ人々がGACにそれを使用したくないのであれば、それを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;
}
`` `
関連する問題
- 1. .NETアセンブリのロード優先度
- 2. .NET参照アセンブリ - バージョン番号
- 3. .NETからWinRTアセンブリをロードする
- 4. .NETアセンブリを動的にロードする
- 5. TeamCityのバージョンを.NETアセンブリのバージョンと一致させる
- 6. .NET - 既にロードされているアセンブリのファイルまたはアセンブリをロードできませんでした
- 7. アセンブリの参照をターゲットの新しいバージョンに更新する
- 8. .NETアセンブリからプロジェクト設定をロード
- 9. .NETアセンブリのバージョンを日付に変換できますか?
- 10. URLClassloaderのライブラリjarの最新バージョンのクラスをロードする
- 11. 最新のWordpressバージョン番号を取得する.net
- 12. 特定の.NETバージョン(VS2008)に対してマネージC++アセンブリをコンパイル
- 13. .NETアセンブリのバインドに失敗しました(リダイレクトの異なるバージョン)、変です!
- 14. .NET ClickOnceのデプロイメントと間違ったアセンブリが更新されたバージョン
- 15. 実行時に2つのバージョンのアセンブリをロードする
- 16. アセンブリの複数のバージョンを動的にロードする
- 17. 同じアセンブリの異なるバージョンをロードする
- 18. AnkhSVN - 最新バージョン
- 19. .NET 2.0用の最新バージョンのCastle DynamicProxyはどこにありますか?
- 20. 最新のMagentoバージョン
- 21. 最新バージョンのWinDiff?
- 22. 最新のNodeJSバージョン
- 23. PSWebServiceLibraryの最新バージョン
- 24. ファイルまたはアセンブリ 'Autofac、バージョン= 3.0.0.0をロードできませんでした
- 25. "エラー...ファイルまたはアセンブリ 'MySql.Data.Entity.EF5、バージョン= 6.9.9.0 ..."をロードできませんでした
- 26. LinuxのPowerShell - .NETアセンブリをロードするには?
- 27. .NETコアのストリームからアセンブリをロードする方法
- 28. 最新バージョンのアンドロイドアプリを更新する
- 29. .NETの式ツリーを新しいアセンブリにリンクする
- 30. アセンブリを新しいAppDomainにロードする際のエラー
だけターゲット・マシンのようにGACにMicrosoft.SqlServer.Smoアセンブリで構成された開発マシン/ビルドマシンですか? – sevzas
はい私の開発マシンは、GACのv11、v12、v13を持っています – gigi
あなたの.csprojファイルでSmoアセンブリへの参照のSpecificVersionプロパティをfalseに設定するのがいいようです。この回答が役立つかどうかを確認するhttp://stackoverflow.com/questions/1063459/net-reference-specificversion-true-or-false – sevzas