2

私が持っているシナリオはかなり一般的です.1つのナゲットパッケージはV1.0を使用しており、別のナゲットパッケージはV1.1を使用しているため、バインディングリダイレクトを追加する必要がありました. ただし、Moles ランナーは、App.config ファイルとアセンブリ構成ファイルの両方でバインディング リダイレクトを無視しているようです。

App.config をロードするには、次のコードを使用しています: How To Read UnitTest Project's App.Config From Test With HostType("Moles")

何か案は?

時間がかかりましたが、Binding Redirect の動作を模倣する方法を見つけました。これは私がそのために行ったコードです。これを 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);
        };
    }
4

0 に答える 0