Last innbyrdes sammenstillinger fra C ++ / CLI

stemmer
1

Jeg ønsker å laste to montasjer fra C ++ / CLI; forsamlingen En avhenger montering B, og begge er VB.Net prosjekter (3,5). Jeg vil at de skal laste fra en byte array, så jeg bruker Assembly :: Load (), men når jeg prøver på å bruke en klasse fra forsamlingen A, ignorerer de rammer den tidligere lastet montering B og forsøker å laste det igjen, som svikter fordi det er ikke i søkestien. Navn av forsamlingen er det samme, så jeg vet ikke hvorfor det svikter. For testformål, laster programmet mitt byte direkte fra den kompilerte bildet, men den virkelige koden vil bli lastet annerledes. Dette er min test kode:

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

Feilen er:

Kan ikke laste fil eller montering ' AssemblyB, Version = 1.0.3650.39903, Culture = nøytral, PublicKeyToken = null ' eller et av dets avhengigheter. Systemet finner ikke den angitte filen.

Når jeg sjekke assemblyb-> Fullname, sier det akkurat ' AssemblyB, versjon = 1.0.3650.39903, Culture = nøytral, PublicKeyToken = null '.

Selvfølgelig, hvis jeg kopierer AssemblyB.dll til min testprogram mappe koden fungerer helt fint, men det er ikke det jeg vil.

Noen ideer?

(Forresten, min andre trinnet forsøke å gjøre AssemblyA bruke klasser som min C ++ / CLI exe vil utsette.)

Publisert på 30/12/2009 klokken 00:07
kilden bruker
På andre språk...                            


1 svar

stemmer
5

OK, jeg bare flau selv. Det er alt i docs.

// 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);
.
.
.

Jeg håper noen finner dette nyttig. :)

Svarte 30/12/2009 kl. 00:39
kilden bruker

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