Frage

Ich möchte zwei Baugruppen laden von C ++ / CLI; Baugruppe A hängt von Baugruppe B, und beide sind VB.Net Projekte (3.5). Ich mag, dass sie von einem Byte-Array laden, so dass ich Assembly verwenden :: Load (), aber wenn ich versuche, eine Klasse von Assembly A zu instanziiert, ignoriert der Rahmen, um die zuvor geladene Baugruppe B 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 Bytes mein Programm lädt die 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(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;
}

Der Fehler ist:

Datei konnte nicht geladen werden oder Assembly ' AssemblyB, Version = 1.0.3650.39903, Culture = neutral, PublicKeyToken = null ' oder eine ihrer Abhängigkeiten. Das System kann die Datei nicht finden angegeben.

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

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

Irgendwelche Ideen?

(By the way, mein zweiter Schritt Versuch wird AssemblyA Nutzungsklassen zu machen, dass meine C ++ / CLI exe aus.)

War es hilfreich?

Lösung

OK, ich peinlich mich einfach. Es ist alles in den Docks.

// 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, jemand findet diese nützlich. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top