Laden von voneinander abhängigen Baugruppen von C ++ / CLI

stimmen
1

Ich möchte von C zwei Baugruppen laden ++ / CLI; Baugruppe A hängt von Baugruppe B, und beide sind VB.Net Projekte (3.5). Ich möchte, dass sie von einem Byte-Array laden, so dass ich Assembly :: Load (), aber wenn ich versuche, eine Klasse von Assembly A zu instanziiert, ignoriert der Rahmen der zuvor Baugruppe B geladen und versucht es erneut zu laden, die fehlschlägt, weil es ist nicht im Suchpfad. Der „Name“ der Anordnung ist das gleiche, so dass ich weiß nicht, warum es funktioniert nicht. Zu Testzwecken lädt mein Programm die Bytes direkt aus dem kompilierten Bild, aber der eigentliche Code wird anders geladen werden. Das ist mein Testcode:

#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(Lc:\\...\\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(Lc:\\...\\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(LAssemblyA.MainForm);

    // This line is not reached unless I copy assemblyb.dll to my app's folder:
    mf->GetType()->InvokeMember(LShowDialog,BindingFlags::Default | BindingFlags::InvokeMethod,
                                mf->GetType()->DefaultBinder, mf, nullptr );

    return 0;
}

Der Fehler ist:

Konnte Datei oder Assembly 'laden AssemblyB, Version = 1.0.3650.39903, Culture = neutral, PublicKeyToken = null ' oder eine ihrer Abhängigkeiten. Die angegebene Datei wurde vom System nicht gefunden.

Wenn ich assemblyb-> Fullname überprüfen, heißt es genau ' AssemblyB, Version = 1.0.3650.39903, Culture = neutral, PublicKeyToken = null '.

Natürlich, wenn ich funktioniert der Code AssemblyB.dll zu meinem Testprogrammordner kopieren ganz gut, aber das ist nicht das, was ich will.

Irgendwelche Ideen?

(By the way, wird mein zweiter Schritt versuchen werden, um AssemblyA Verwendung Klassen zu machen, dass meine C ++ / CLI exe aussetzen wird.)

Veröffentlicht am 30/12/2009 um 03:07
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
5

OK, ich embarrased mich gerade. Es ist alles in der Dokumentation.

// This class is just for holding a managed static variable for assemblyB
ref class Resolver {
public:
    static  Assembly^   assemblyB;
};

// This is the delegate for resolving assemblies
Assembly^ ResolveHandler(Object^ Sender, ResolveEventArgs^ args)
{
    // Warning: this should check the args for the assembly name!
    return Resolver::assemblyB;
}
.
.
.
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Set up the handler for the AssemblyResolve event
    AppDomain::CurrentDomain->AssemblyResolve += gcnew ResolveEventHandler( ResolveHandler );
.
.
.
    // Load assemblyb into the static variable available to the resolver delegate
    Resolver::assemblyb = Assembly::Load(bytes);
.
.
.

Ich hoffe, dass jemand dies nützlich findet. :)

Beantwortet am 30/12/2009 um 03:39
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more