“Impossible de charger le fichier ou l'assembly 'Système.De base, Version=2.0.5.0,...” exception lors du chargement de la Bibliothèque de classes Portable dynamiquement

Tout d'abord j'ai besoin de souligner qu'il est question légèrement différente de celle de ce fil. En outre, l'installation de KB2468871 ne l'aide pas.

J'ai essayé de simplifier ce problème autant que possible. En général, il sur le chargement de PCL assemblées en application de Bureau de l'Assemblée.LoadFile(...).

Disons qu'il y a un .NET 4.0 Application Console (appelé "C"). Il fait référence .NET 4.0 assemblée (appelé "N4") et PCL assemblée (appelé "PCL").

où N4 ressemble à ceci:

using System.Linq;

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

PCL ressemble à ceci:

using System.Linq;

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

et C ressembler à ceci:

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);
            }
        }
    }
}

Lorsque vous exécutez cette application, vous obtenez absolument des résultats corrects:

N4: HELLO FROM N4
PCL: HELLO FROM PCL

Nous allons ajouter un événement AssemblyResolve à CurrentDomain dans le Programme.Principal:

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;
};

Alors ce qu'il fait, si l'assemblée ne peut pas être trouvé, il essaie de le charger à partir ".de données" fichier.

Allons dossier de l'application et de le renommer "N4.dll" "la N4.de données" et exécuter "C.exe".

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

De sorte qu'il passe par AssemblyResolve et enfin, charge "N4.de données" et travaille aussi bon que l'original.

Nous allons revenir "N4.les données" pour "N4.dll" et le renommer en "PCL.dll" pour "PCL.de données" et...

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.

Veuillez noter que PCL assemblée a été chargé correctement, le problème est, il ne peut pas trouver ses dépendances (Système d'.De base) plus.

C'est comme de l'Assemblée.LoadFile(nom de fichier) est un non-non si elle est chargée de l'assemblée est portable.

Quelqu'un a ce problème? Quelqu'un a résolu ce problème?

Vous pouvez trouver tous les fichiers ici.

EDIT:
Grâce à leppie pour me forcer à vérifier d'autres options. En fait, je voulais être sûr que je ne suis pas mentir alors que je réponds "ouais, Ouais, j'ai essayé". Apparemment, c'était la peine de vérifier.

De Suzanne Cook .NET CLR Notes:

Être prudent - ce n'est pas la même chose.

LoadFrom() va, par la Fusion et peuvent être redirigés vers une autre assemblée à un chemin différent mais avec la même identité si l'on est déjà chargé dans le LoadFrom contexte.
LoadFile() ne se lient pas, par la Fusion à tous - le loader va de l'avant et charges exactement* ce que l'appelant a demandé. Il n'utilise pas la Charge ou le LoadFrom contexte.

Avez-vous essayé Assembly.LoadFrom ou de le charger comme un tableau d'octets?
Je suis stupéfait. LoadFrom (...), alors que LoadFile(...) n'est pas (btw, la Charge(byte[]) ne fonctionne pas non plus). Si vous rendre une réponse que je peux vous accorder une tique. Merci.
Répondre à votre propre question et obtenir quelques rep ;p

OriginalL'auteur Milosz Krajewski | 2013-08-16