Wyjątek pamięci systemówej
Gdy programiści używają najnowszej wersji IronOCR na platformie .NET Framework, zdarzają się sytuacje, w których uruchomienie programu powoduje wyświetlenie komunikatu System.Memory Exception, jak pokazano poniżej.
Could not load file or assembly 'System.Memory, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Chociaż ten problem nie jest bezpośrednio związany z samym IronOCR, istnieją znane problemy z kompatybilnością z zależnościami System.Memory. Nawet gdy zainstalowana jest nowsza wersja System.Memory (np. 4.4.5 lub późniejsza) — czy to jako część innej zależności, czy jako bezpośrednie odniesienie — środowisko uruchomieniowe wciąż może rzucać błędami związanymi z wersją.
Dzieje się tak, ponieważ niektóre zależności wymuszają ścisłe wiązanie wersji, co oznacza, że oczekują konkretnej wersji System.Memory, niezależnie od tego, czy jest dostępna nowsza, teoretycznie kompatybilna wersja. W efekcie błąd utrzymuje się, dopóki nie zastosujemy obejścia opisanego poniżej.
Rozwiązanie
Rozwiązaniem tego wyjątku jest zmodyfikowanie App.config za pomocą poniższego kodu.
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Wyjaśnienie
Zmodyfikowany App.Config ma na celu zapobieganie konfliktom wersji, które mogą powstać, gdy wiele zależności wymaga różnych wersji tego samego zestawu. Dzięki tej konfiguracji aplikacja załaduje odpowiednią wersję w czasie wykonywania. Przekierowanie wymusza na wszystkich komponentach użycie wersji v4.0.1.2, eliminując w ten sposób możliwość wystąpienia wspomnianego wyjątku. Po zmodyfikowaniu App.Config uruchom ponownie aplikację, aby upewnić się, że program nie zgłasza kolejnego wyjątku.
Aby uzyskać więcej informacji i dyskusji na ten temat, można odwiedzić stronę GitHub, która szczegółowo opisuje wyjątek i obecne obejście tutaj.

