我的场景很常见,一个 nuget 包使用 V1.0,另一个使用 V1.1,所以我必须添加一个绑定重定向。但是,moles runner 似乎忽略了 App.config 和程序集配置文件中的绑定重定向。
要加载 App.config,我正在使用以下代码:How To Read UnitTest Project's App.Config From Test With HostType("Moles")
有任何想法吗?
好的,我花了一些时间,但我已经弄清楚如何模仿绑定重定向的行为。这是我为此做的代码。将此保留为 Wiki,以允许其他人改进此代码:
<!-- language: lang-cs -->
public static void MoleBindingRedirect()
{
try
{
var fileMap = new ExeConfigurationFileMap();
Assembly assembly = Assembly.GetExecutingAssembly();
fileMap.ExeConfigFilename = assembly.Location + ".config";
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
ConfigurationSection assemblyBindingSection = config.Sections["runtime"];
var sectionRoot = XDocument.Parse(assemblyBindingSection.SectionInformation.GetRawXml()).Root;
var assemblyBinding = sectionRoot.Elements(XName.Get("assemblyBinding", "urn:schemas-microsoft-com:asm.v1"));
if (assemblyBinding == null)
return;
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var assemblyToLoad = new AssemblyName(args.Name);
var query = from dependency in assemblyBinding.Elements(XName.Get("dependentAssembly", "urn:schemas-microsoft-com:asm.v1"))
from identity in dependency.Elements(XName.Get("assemblyIdentity", "urn:schemas-microsoft-com:asm.v1"))
from attribute in identity.Attributes()
where attribute.Value == assemblyToLoad.Name
select dependency;
if (!query.Any())
return null;
var assemblyDefinition = query.First();
var identityElement = assemblyDefinition.Element(XName.Get("assemblyIdentity", "urn:schemas-microsoft-com:asm.v1"));
var bindingRedirectElement = assemblyDefinition.Element(XName.Get("bindingRedirect", "urn:schemas-microsoft-com:asm.v1"));
var assemblyName = identityElement.Attribute("name").Value;
var assemblyPublicKeyToken = identityElement.Attribute("publicKeyToken");
var assemblyCulture = identityElement.Attribute("culture");
var assemblyVersion = bindingRedirectElement.Attribute("newVersion").Value;
if (assemblyPublicKeyToken != null && !string.IsNullOrWhiteSpace(assemblyPublicKeyToken.Value))
assemblyName += ", PublicKeyToken=" + assemblyPublicKeyToken.Value;
if (assemblyCulture != null && !string.IsNullOrWhiteSpace(assemblyCulture.Value))
assemblyName += ", Culture=" + assemblyCulture.Value;
if (!string.IsNullOrWhiteSpace(assemblyVersion))
assemblyName += ", Version=" + assemblyVersion;
return Assembly.Load(assemblyName);
};
}