Je souhaite charger deux assemblys à partir de C++/CLI; L'assemblage A dépend de l'assemblage B et les deux sont des projets VB.Net (3.5). Je veux les charger à partir d'un tableau d'octets, donc j'utilise Assembly :: Load(), mais quand j'essaye d'instancier une classe de l'assembly A, le framework ignore l'assembly B précédemment chargé et tente de le charger à nouveau, ce n'est pas dans le chemin de recherche. Le "Nom" de l'assemblage est le même, donc je ne sais pas pourquoi cela échoue. À des fins de test, mon programme charge les octets directement à partir de l'image compilée, mais le code réel sera chargé différemment. Ceci est mon code de test:Chargement d'assemblages interdépendants à partir de C++/CLI
#include "stdafx.h"
using namespace System;
using namespace System::Windows::Forms;
using namespace System::IO;
using namespace System::Reflection;
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
array<unsigned char>^ bytes;
FileStream^ f;
f = gcnew FileStream(L"c:\\...\\AssemblyB.dll", FileMode::Open);
bytes = gcnew array<unsigned char>((int)f->Length);
f->Read(bytes, 0, (int) f->Length);
f->Close();
f = nullptr;
Assembly^ assemblyb = Assembly::Load(bytes);
f = gcnew FileStream(L"c:\\...\\AssemblyA.dll", FileMode::Open);
bytes = gcnew array<unsigned char>((int)f->Length);
f->Read(bytes, 0, (int) f->Length);
f->Close();
f = nullptr;
Assembly^ assemblya = Assembly::Load(bytes);
bytes = nullptr;
// Here I get the file not found exception!
Object^ mf = assemblya->CreateInstance(L"AssemblyA.MainForm");
// This line is not reached unless I copy assemblyb.dll to my app's folder:
mf->GetType()->InvokeMember(L"ShowDialog",BindingFlags::Default | BindingFlags::InvokeMethod,
mf->GetType()->DefaultBinder, mf, nullptr);
return 0;
}
L'erreur est:
Impossible de charger le fichier ou l'assembly 'AssemblyB, Version = 1.0.3650.39903, Culture = neutral, PublicKeyToken = null' ou l'un des ses dépendances. Le système ne peut pas trouver le fichier spécifié.
Quand je vérifie assemblyb-> FullName, il dit exactement 'AssemblyB, Version = 1.0.3650.39903, Culture = neutral, PublicKeyToken = null'.
Bien sûr, si je copie AssemblyB.dll dans le dossier de mon programme de test, le code fonctionne très bien, mais ce n'est pas ce que je veux.
Des idées?
(Soit dit en passant, ma deuxième étape sera tenter de faire des cours d'utilisation AssemblyA que mon C++/CLI exe exposeront.)
Mmmm ... d'après ce que j'ai lu ici (http://stackoverflow.com/questions/416468/weird-behaviour-when-mixing-loading-of-assemblies-using-assembly-loadfrom-and-ass) il semble que je devrais implémenter un ResolveHandler, mais je n'ai pas la moindre idée de la syntaxe de AddHandler() en C++/CLI! : P –