Vra

Ek het'n probleem soortgelyk aan,maar subtiel verskil van, wat beskryf hier (Laai gemeentes en hul afhanklikes).

Ek het'n C++ DLL vir 3D-vertoning wat is dit wat ons verkoop aan kliënte.Vir .NETTO gebruikers sal ons'n CLR wrapper rondom dit.Die C++ DLL gebou kan word in beide 32-en 64-bis-weergawes, maar ek dink dit beteken dat ons nodig het om twee CLR omhulsels sedert die CLR bind aan'n spesifieke DLL?

Nou sê ons kliënt het'n .NETTO app wat kan óf 32 of 64-bis, en dat dit'n suiwer .NETTO app dit laat die CLR om dit uit te werk van'n enkele stel van gemeentes.Die vraag is hoe kan die app kode dinamiese kies tussen ons 32 en 64bit CLR/DLL kombinasies op run-time?

Selfs meer spesifiek, is die voorgestelde antwoord op die bogenoemde vraag hier van toepassing te (dws.skep'n ResolveEvent hanteerder)?

Was dit nuttig?

Oplossing

Ek het uiteindelik'n antwoord vir dit wat blyk te werk.

Stel beide 32 & 64 bis-weergawes - beide daarin geslaag & onbeheerde - in'n aparte dopgehou.Dan het die .NETTO app kies by die begin tyd wat die gids te laai die gemeentes uit.

Die probleem met die gebruik van die ResolveEvent is dat dit raak net genoem as gemeentes is nie gevind nie, so dit is al te maklik om per ongeluk beland met 32 bis-weergawes.In plaas daarvan gebruik om'n tweede AppDomain voorwerp waar ons kan verander die ApplicationBase eiendom te wys op die regte gids.So beland jy met'n kode soos:

static void Main(String[] argv)
  {
     // Create a new AppDomain, but with the base directory set to either the 32-bit or 64-bit
     // sub-directories.

     AppDomainSetup objADS = new AppDomainSetup();

     System.String assemblyDir = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
     switch (System.IntPtr.Size)
     {
        case (4): assemblyDir += "\\win32\\";
           break;
        case (8): assemblyDir += "\\x64\\";
           break;
     }

     objADS.ApplicationBase = assemblyDir;

     // We set the PrivateBinPath to the application directory, so that we can still
     // load the platform neutral assemblies from the app directory.
     objADS.PrivateBinPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

     AppDomain objAD = AppDomain.CreateDomain("", null, objADS);
     if (argv.Length > 0)
        objAD.ExecuteAssembly(argv[0]);
     else
        objAD.ExecuteAssembly("MyApplication.exe");

     AppDomain.Unload(objAD);

  }

Jy eindig met 2 ekse - jou normale app en'n tweede skakel app wat kies watter stukkies te laai.Let wel - ek kan nie krediet neem vir die besonderhede van hierdie myself.Een van my kollegas sussed wat uit my aanvanklike wyser.As en wanneer hy tekens tot StackOverflow ek sal jou wys die antwoord aan hom

Ander wenke

Ek was in staat om dit te doen oor 'n jaar gelede, maar ek nie meer al die besonderhede onthou. Basies, kan jy IntPtr.Size gebruik om te bepaal watter DLL om te laai, dan voer die werklike LoadLibrary deur p / roep. Op daardie stadium, het jy die module in die geheue het en jy behoort aan net p / Roep funksies van die binnekant van dit - dieselfde naam module moet nie weer kry herlaai

.

Ek dink egter dat in my aansoek ek eintlik moes die C ++ DLL self registreer as 'n COM-bediener en dan toegang tot sy funksies deur 'n gegenereer NET omslag - so ek weet nie of ek ooit p getoets / aanroep direk.

Ek ondervind 'n soortgelyke scenario 'n rukkie terug. A toolkit Ek is met behulp van nie goed gedra in 'n 64-bit omgewing en ek was nie in staat om 'n manier om dinamiese werking van die gemeentes te bind as 32 bit vind.

Dit is moontlik om jou gemeentes dwing om te werk in 32 bit mode, maar dit verg lap die CLR kop, (daar is 'n instrument wat doen dit in die raamwerk) en as jou gemeentes word sterk-vernoem, dit nie werk nie uit.

Ek is bevrees jy nodig het om te bou en te publiseer twee stelle binaries vir 32 en 64 bit platforms.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top