---
# System prepended metadata

title: 'CsvHelper ファイルまたはアセンブリ ''Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51''、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)　2021-03-19'
tags: [.NET Framework, C#, CsvHelper, Microsoft.Bcl.AsyncInterfaces]

---

---
lang: ja-jp
breaks: true
---
# CsvHelper ファイルまたはアセンブリ 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)　2021-03-19


## １．動作環境
* Windows 10
* Visual Studio 2017
* .Net Framework 4.7.2
* CsvHelper 22.1.2.0
* Microsoft.Bcl.AsyncInterfaces 5.0.20.51904

## ２．エラーログ
```=
An unexpected error occurred.
IWriter state:
   Row: 2
   Index: 0
   HeaderRecord:
2

System.Exception: An unexpected error occurred.
IWriter state:
   Row: 2
   Index: 0
   HeaderRecord:
2
 ---> CsvHelper.WriterException: An unexpected error occurred.
IWriter state:
   Row: 2
   Index: 0
   HeaderRecord:
2
 ---> System.IO.FileLoadException: ファイルまたはアセンブリ 'Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
   場所 System.Signature.GetSignature(Void* pCorSig, Int32 cCorSig, RuntimeFieldHandleInternal fieldHandle, IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
   場所 System.Signature..ctor(IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
   場所 System.Reflection.RuntimeConstructorInfo.GetParametersNoCopy()
   場所 System.Reflection.RuntimeConstructorInfo.GetParameters()
   場所 CsvHelper.ObjectCreator.GetConstructor(ConstructorInfo[] constructors, Type type, Type[] argTypes)
   場所 CsvHelper.ObjectCreator.CreateInstanceFunc(Type type, Type[] argTypes)
   場所 CsvHelper.ObjectCreator.CreateInstance(Type type, Object[] args)
   場所 CsvHelper.ObjectResolver.<>c__DisplayClass17_0.<.cctor>b__1(Type type, Object[] args)
   場所 CsvHelper.ObjectResolver.Resolve(Type type, Object[] constructorArgs)
   場所 CsvHelper.ObjectResolver.Resolve[T](Object[] constructorArgs)
   場所 CsvHelper.CsvWriter.<>c__DisplayClass48_0.<.ctor>b__0()
   場所 System.Lazy`1.CreateValue()
   場所 System.Lazy`1.LazyInitValue()
   場所 System.Lazy`1.get_Value()
   場所 CsvHelper.CsvWriter.WriteRecord[T](T record)
   --- 内部例外スタック トレースの終わり ---
```

## ３．原因

Microsoft.Bcl.AsyncInterfacesのバージョンが「4.700.19.56404」であればエラーは発生しない。
しかし、CsvHelper以外のモジュールで 「5.0.20.51904」が必要なためバージョンを下げることは出来ない。

## ４．対応策

しょうがないので、Microsoft.Bcl.AsyncInterfacesがアッセンブリをロードする際にバージョン番号を書き換えて動的にロードするようにする。
とりあえずこの対応で様子を見てみます。

アッセンブリを動的にロードするクラスを作成
```csharp=
    public static class DotNetCoreRuntimeLoader
    {
        private static Dictionary<string/* AssemblyName */, string/* Version */> m_dicAssembly = null;
        private static HashSet<string/* assemblyString */> m_hasLoad_Fails = new HashSet<string/* assemblyString */>();

        static DotNetCoreRuntimeLoader()
        {
            m_dicAssembly = new Dictionary<string, string>()
            {
                { "Microsoft.Bcl.AsyncInterfaces", "5.0.0.0" }
            };
        }

        /// <summary>
        /// 【usage】
        /// AppDomain.CurrentDomain.AssemblyResolve += DotNetCoreRuntimeLoader.AssemblyResolver;
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        public static Assembly AssemblyResolver(object sender, ResolveEventArgs args)
        {
            LogManager.OutInfoLog(() => "DotNetCoreRuntimeLoader.AssemblyResolver args.Name              :" + args.Name);
            LogManager.OutInfoLog(() => "DotNetCoreRuntimeLoader.AssemblyResolver args.RequestingAssembly:" + args.RequestingAssembly);
            Assembly resultat = AssemblyReload(args.Name);
            if (resultat != null)
            {
                LogManager.OutInfoLog(() => "DotNetCoreRuntimeLoader.AssemblyResolver resultat != null");
            }
            return resultat;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="requestingAssemblyName"></param>
        /// <returns></returns>
        private static Assembly AssemblyReload(
            String requestingAssemblyName
            )
        {
            Assembly result = null;

            if (StringUtil.IsEmpty(requestingAssemblyName) == false)
            {
                // アセンブリ名を取得する。
                // "Microsoft.Bcl.AsyncInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51"
                string strAssemblyName = StringUtil.GetStrSplit(requestingAssemblyName, ", ", 0);

                string strVersion = "";
                if (m_dicAssembly.TryGetValue(strAssemblyName, out strVersion))
                {
                    String assemblyString = requestingAssemblyName;
                    if (StringUtil.IsEmpty(strVersion) == false)
                    {
                        // Version値の置換
                        assemblyString = RegexUtil.GetReplaceString(requestingAssemblyName, @"(?<TagStart>, Version=).+(?<TagEnd>, )", @"${TagStart}" + strVersion + @"${TagEnd}");
                    }

                    if (StringUtil.IsEmpty(assemblyString) == false)
                    {
                        // 以下のロードに失敗すると、無限ループに陥りアプリが落ちるので、一度失敗したものは読み込まない。
                        if (m_hasLoad_Fails.Contains(assemblyString) == false)
                        {
                            try
                            {
                                m_hasLoad_Fails.Add(assemblyString);
                                result = AppDomain.CurrentDomain.Load(assemblyString);
                            }
                            catch
                            {
                                result = null;
                            }
                            if (result != null)
                            {
                                // 成功したら、失敗のハッシュから削除。
                                m_hasLoad_Fails.Remove(assemblyString);
                            }
                            LogManager.OutInfoLog(() => "DotNetCoreRuntimeLoader.AssemblyReload assemblyString:" + assemblyString);
                        }
                    }

                }
            }

            return result;
        }

    }

```

使い方
```csharp=
AppDomain.CurrentDomain.AssemblyResolve += DotNetCoreRuntimeLoader.AssemblyResolver;
```

###### tags: `CsvHelper` `C#` `.NET Framework` `Microsoft.Bcl.AsyncInterfaces`
