„Nie można załadować pliku lub zespołu„ System.Core, Version = 2.0.5.0,… ”wyjątek podczas dynamicznego ładowania przenośnej biblioteki klas

Przede wszystkim muszę podkreślić, że jest to nieco inne pytanie niż to, w którym się znajdujemyten wątek. Dodatkowo instalacjaKB2468871 nie pomaga.

Starałem się jak najbardziej uprościć ten problem. Ogólnie o ładowaniu zestawów PCL w aplikacji Desktop z Assembly.LoadFile (...).

Powiedzmy, że istnieje aplikacja konsoli .NET 4.0 (zwana „C”). Odwołuje się do zespołu .NET 4.0 (zwanego „N4”) i zestawu PCL (zwanego „PCL”).

gdzie N4 wygląda tak:

using System.Linq;

namespace N4
{
    public class ClassInN4
    {
        public static string Greet()
        {
            return new string(
                "hello from N4"
                .ToCharArray()
                .Select(char.ToUpper)
                .ToArray()
            );
        }
    }
}

PCL wygląda tak:

using System.Linq;

namespace PCL
{
    public class ClassInPCL
    {
        public static string Greet()
        {
            return new string(
                "hello from pcl"
                .ToCharArray()
                .Select(char.ToUpper)
                .ToArray()
            );
        }
    }
}

i C wyglądają tak:

using System;
using System.IO;
using System.Reflection;
using N4;
using PCL;

namespace C
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Test();
            Console.ReadLine();
        }

        private static void Test()
        {
            Test("N4", ClassInN4.Greet);
            Test("PCL", ClassInPCL.Greet);
        }

        private static void Test(
            string title, 
            Func<string> generator)
        {
            try
            {
                Console.WriteLine(
                    "{0}: {1}", title, generator());
            }
            catch (Exception e)
            {
                Console.WriteLine(
                    "{0}: {1} -> {2}", title, e.GetType(), e.Message);
            }
        }
    }
}

Po uruchomieniu tej aplikacji uzyskasz absolutnie poprawne wyniki:

N4: HELLO FROM N4
PCL: HELLO FROM PCL

Dodajmy zdarzenie AssemblyResolve do CurrentDomain w Program.Main:

AppDomain.CurrentDomain.AssemblyResolve += (_, a) => {
    var fileName = Path.GetFullPath(
        new AssemblyName(a.Name).Name + ".data");
    Console.WriteLine("Probing '{0}'", fileName);
    return 
        File.Exists(fileName) 
        ? Assembly.LoadFile(fileName) 
        : null;
};

Więc co robi, jeśli nie można znaleźć zespołu, próbuje załadować go z pliku „.data”.

Przejdźmy do folderu aplikacji i zmień nazwę „N4.dll” na „N4.data” i uruchom „C.exe”.

Probing 'C:\xxx\C\bin\Debug\N4.data'
N4: HELLO FROM N4
PCL: HELLO FROM PCL

Tak więc przechodzi przez AssemblyResolve i ostatecznie ładuje „N4.data” i działa tak dobrze jak oryginał.

Przywróćmy „N4.data” do „N4.dll” i zmieńmy nazwę „PCL.dll” na „PCL.data” i…

Probing 'C:\xxx\C\bin\Debug\PCL.data'
N4: HELLO FROM N4
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
Probing 'C:\xxx\C\bin\Debug\System.Core.data'
PCL: System.IO.FileNotFoundException -> Could not load file or assembly 'System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, Retargetable=Yes' or one of its dependencies. The system cannot find the file specified.

Należy pamiętać, że zestaw PCL został załadowany w porządku, problem polega na tym, że nie można już znaleźć jego zależności (System.Core).

To jest jak Assembly.LoadFile (fileName) jest-nie-nie, jeśli załadowany zespół jest przenośny.

Czy ktoś miał ten problem? Czy ktoś rozwiązał ten problem?

Możesz znaleźć wszystkie plikitutaj.

EDYTOWAĆ: Dzięki leppie za zmuszenie mnie do sprawdzenia innych opcji. Właściwie chciałem być pewien, że nie kłamię, kiedy odpowiadam „Tak, tak, próbowałem”. Najwyraźniej warto było to sprawdzić.

ZNotatki .NET CLR Suzanne Cook:

Bądź ostrożny - to nie to samo.

LoadFrom () przechodzi przez Fusion i może zostać przekierowany do innego zespołu na innej ścieżce, ale z tą samą tożsamością, jeśli jest już załadowana w kontekście LoadFrom. LoadFile () w ogóle nie wiąże się z Fusion - program ładujący po prostu idzie do przodu i ładuje dokładnie * to, czego zażądał dzwoniący. Nie używa kontekstu Load ani LoadFrom.

questionAnswers(3)

yourAnswerToTheQuestion