Domanda

Ho un progetto .NET che è sempre stato creato / gestito da / su macchine a 32 bit. Ho un nuovo computer a 64 bit e sto cercando di affrontare il compito di farlo funzionare lì. Lo script di compilazione è in nant e ad un certo punto compiliamo del codice boo utilizzando l'attività nant. Il codice boo fa riferimento alla nostra DLL principale, che è stata creata da c # source in precedenza nel processo di compilazione.

Ho provato due cose: costruirlo per funzionare in modalità 32 bit e costruirlo per funzionare in modalità 64 bit. Usando corflags su diversi programmi (incluso booc), sono stato in grado di costruire il progetto costruito in modalità 32 bit, ma alla fine ho avuto un sacco di problemi a valle. Quindi devo costruirlo in modalità 64 bit, che penso sia preferibile comunque.

Secondo il codice sorgente nant / booc, l'attività booc nant chiama il booc.exe in-process usando la classe Process del CLR, quindi (penso) dovrebbe ereditare 32bitness o 64bitness dal processo parent. Ciò non riflette ciò che sto vedendo, però.

Ecco cosa ho fatto:

  1. Utilizzata la versione a 64 bit di powershell per invocare nant
  2. Piattaforma specificata = " x64 " sui miei compiti. Sento che non dovrei farlo perché anycpu dovrebbe andare bene, ma sembra fare la differenza.

Ecco l'errore che sto ricevendo:

[booc] Compiling 5 files to 'C:\dev\build\MyProjectBoo.dll'.
[booc] BCE0106: Failed to access the types defined in assembly 'MyProject, Version=5.5.0.0, Culture=neutral, PublicKeyToken=null' - (C:\dev\build\MyProject.dll):Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.
[booc]  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc]  is not a valid Win32 application. (Exception from HRESULT: 0x800700C1)
[booc] .
[booc] 1 error(s).

Il che significa che, in base al codice sorgente booc, "ho cercato di elencare in modo riflessivo i tipi nell'assieme a cui si fa riferimento ma non sono riuscito". Non so se ciò significhi, "Penso di essere a 32 bit ma questi sono dll a 64 bit" o cosa, e sono molto confuso.

Qualche idea su come posso farlo funzionare?

Aggiorna dopo alcuni lavori, ho scoperto che il problema non ha nulla a che fare con Boo. Ho scritto un rapido programma c # che carica in modo riflessivo la dll e si interrompe allo stesso modo. Quindi, per qualche motivo, indipendentemente da ciò che ho impostato come piattaforma (x86, x64 o anycpu), non riesco a caricarlo in modo riflessivo su una macchina x64. Quindi non è davvero colpa di Boo. Quindi ho intenzione di scavare in questo e ripubblicare se ho una domanda migliore.

Aggiornamento più recente Si scopre che una delle dipendenze di terze parti della mia DLL principale insiste per essere in un ambiente a 32 bit, anche se non è costruito con corflags. Ciò causa il fallimento di assembly.GetTypes () in modalità 64 bit.

È stato utile?

Soluzione

Il problema sono le dipendenze da DLL di terze parti che richiedono la modalità a 32 bit, il che è possibile anche se non hanno corflags impostato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top