“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.
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
Vous devez vous connecter pour publier un commentaire.
Vous pouvez retourner le
System.Core
assemblage de votre plate-forme (par exemple,version 4.0.0.0 for .NET Framework 4.0
) à partir de laAssemblyResolve
les cas, lorsque la demande pour le2.0.5.0
version.Je suis le chargement de toutes mes assemblys référencés stockées en tant que ressources via
Load(byte[])
, aussi, qui ne parvient pas à résoudre le2.0.5.0
de l'assemblée, et j'ai récupérer les deuxSystem
etSystem.Core
deAppDomain.CurrentDomain.GetAssemblies()
.vous donne la bonne assemblées et vous n'avez pas besoin de s'en soucier .NET 4 ou 4.5.
OriginalL'auteur Gabriel Horvath
Je pense que vous êtes l'obtention de ces questions parce que:
http://www.paraesthesia.com/archive/2013/01/21/using-portable-class-libraries-update-net-framework.aspx
Prendre note de la WSUS - vous peut pense vous avez les dernières mises à jour, mais vous n'avez pas la cause de votre serveur WSUS est pas à jour.
Ce patch peut aider, mais vous êtes mieux de simplement obtenir tous les .net des mises à jour:
http://support.microsoft.com/kb/2468871
(à partir d'un commentaire ci-dessus)
Essayer LoadFrom(...) plutôt que de LoadFile(...) /Charge(byte[]) et voir si cela résout votre problème? 🙂
Hmmm... j'ai eu le même problème avec LoadFile() et l'utilisation de Windows Update pour installer tous les de la .net correctifs résolu pour moi... Juste vérifier, avez-vous tous les .net correctifs (obligatoire / facultatif) installé?
C'était mon problème, serveur avec W2k8 SP1 uniquement et .NET 4.0 exe. Application de SP2 + patchs fixe.
OriginalL'auteur Tod Thomson
J'ai eu le même problème et a terminé avec la solution suivante: appeler le code suivant avant le chargement dynamique de la lcp assemblée.
Si toute autre dépendance est manquante lorsque vous chargez votre PCL assemblée, vous avez juste besoin d'ajouter une ligne de code ci-dessus.
Pour certains étranges et incompréhensibles raison, il fonctionne.
OriginalL'auteur picrap