C#.NET应用程序中的程序集版本绑定

C#.NET应用程序中的程序集版本绑定,c#,visual-studio,versioning,.net-assembly,smo,C#,Visual Studio,Versioning,.net Assembly,Smo,我有一个引用Microsoft.SqlServer.Smo和Microsoft.SqlServer名称空间中的其他程序集的应用程序。VisualStudio为这些引用显示“Specific Version=False”。csproj如下所示: <Reference Include="Microsoft.SqlServer.ConnectionInfo" /> <Reference Include="Microsoft.SqlServer.Management.Sdk.Sfc"

我有一个引用Microsoft.SqlServer.Smo和Microsoft.SqlServer名称空间中的其他程序集的应用程序。VisualStudio为这些引用显示“Specific Version=False”。csproj如下所示:

<Reference Include="Microsoft.SqlServer.ConnectionInfo" />
<Reference Include="Microsoft.SqlServer.Management.Sdk.Sfc" />
<Reference Include="Microsoft.SqlServer.Smo" />
<Reference Include="Microsoft.SqlServer.SmoExtended" />
<Reference Include="Microsoft.SqlServer.SqlEnum" />

版本10是否适用于应用程序的所有场景?有一次,当我这样做的时候,它在所有的情况下都能工作,除了几个边缘案例,幸运的是,我在发布到生产之前就抓住了这些案例。通常,主要版本号更改意味着API中的更改。我的退路是在我的repo中包含一个“第三方”文件夹,其中包含我需要的DLL——在您的例子中是版本11,并引用它们,而不是隐式引用已安装的版本(可能是10或11,也可能没有)。不确定这是否被认为是一种好的做法,但它对我来说一直很有效。嗯,我相当肯定在这种情况下重新分发Microsoft DLL违反了他们的条款。至于最佳实践,很难说。这一点很好地理解了,而不是我实际考虑过的东西。我不记得以前用过哪些程序集。我只知道我需要一个特定的DLL,这是使它工作的一种方法。:)
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolutionFailed;

private static Assembly OnAssemblyResolutionFailed(object sender, ResolveEventArgs args)
{
    const string oldVersionName = "Version=10.0.0.0";
    const string newVersionName = "Version=11.0.0.0";
    Logger.Error("Failed to load assembly: " + args.Name + " from " + args.RequestingAssembly);

    var assemblyName = new AssemblyName(args.Name).FullName;
    if (assemblyName.Contains(oldVersionName))
    {
        assemblyName = assemblyName.Replace(oldVersionName, newVersionName);
    }
    else
    {
        assemblyName = assemblyName.Replace(newVersionName, oldVersionName);
    }
    Logger.Warn("Attemting to load: " + assemblyName);
    var assembly = Assembly.Load(assemblyName);
    return assembly;
}