Domanda

Ho qualche codice .NET uso io dal codice VB6. Ho sempre sviluppato questo su una macchina XP creando un file VB6.exe.manifest che ha elencato le assembly dipendenti .NET.

Per esempio, diciamo che i miei 2 assembly .NET sono Some.Assembly.A.dll e Some.Assembly.B.dll, ecco quello che sembra VB6.EXE.manifest come (io uso la versione = 1.1.0.0 qui di seguito perché è l'insieme versione che su .NET AssemblyVersion in AssemblyInfo.cs):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
   manifestVersion="1.0">
  <assemblyIdentity
              type = "win32"
              name = "client"
              version = "1.1.0.0" />
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.A"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
                  type="win32"
                  name="Some.Assembly.B"
                  version="1.1.0.0" />
    </dependentAssembly>
  </dependency>
</assembly>

Poi, insieme con le DLL nella stessa directory, ho le assemblee e le proprie file manifesto. Ecco un esempio "Some.Assembly.A.dll.manifest":

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" 
  manifestVersion="1.0">
  <assemblyIdentity
      type="win32"
      name="Some.Assembly.A"
      version="1.1.0.0" />
  <clrClass
      clsid="{F1234567-1234-1234-1234-123456789012}"
      progid="Some.Assembly.A.Class1"
      threadingModel="Both"
      name="Some.Assembly.A.Class1" >
  </clrClass>
  <file name = "Some.Assembly.A.dll" />
</assembly>

Ho anche tlbexp girare su DLL di riferimento per creare file TLB, e questo è quello che ho riferimento nella mia file di progetto VB6.

Voglio passare a una macchina di bit di Windows 7 a 64. Usando gli stessi metodi, quando ho colpito il codice VB6 che un'istanza dell'oggetto .NET sulla macchina WIN7 ottengo

"componente ActiveX non può creare Oggetto ".

Su XP, riesce. Se ho volutamente misspell l'assembly dipendente in VB6.EXE.manifest - su XP I get

"Questa applicazione non è stata avviata perché teh configurazione dell'applicazione non è corretto. la reinstallazione del dell'applicazione potrebbe risolvere il problema ".

su Win7, VB6 solo carichi. E 'come ignora il manifesto su Win7, quindi non posso caricare il mio oggetto .NET con metodi REG GRATIS su Win7. Se io regasm la DLL, tutto funziona.
Tutte le idee su come rendere il lavoro VB6 con reg libera com su Win7 (64 bit)?

È stato utile?

Soluzione

Hai provato la semplice installazione e l'esecuzione VB6 in modalità compatibilità Win XP?

Altri suggerimenti

Se state ricompilando VB6.exe o comunque elaborarlo per la macchina win7, si dovrebbe sapere che alcuni dei più recenti strumenti di sviluppo incorporare automaticamente un manifesto quindi si consiglia di verificare la presenza di quel (un modo rapido è quello di aprire il eseguibile in VS, e l'aspetto di una risorsa RT_MANIFEST con id 1). Se c'è un manifesto integrato, manifesti esterni vengono ignorati, che è forse il motivo per cui quando si modifica il manfiest esterna, non succede nulla e il suo contenuto vengono ignorati.

Oltre a quanto detto circa Erno sxstrace (potrebbe postare i risultati che si ottengono da sxstrace?), Assicurarsi di aggiornare il timestamp del VB6.exe se il manifesto è incorporato in esso, o altrimenti VB6.exe.manifest. Vista + Win7 memorizza nella cache il contenuto dei manifesti, calettati fuori il timestamp del manifesto radice in modo che le modifiche locali potrebbero non essere sempre raccolti. Se sxstrace si sta dando risultati vuoti, aggiornare i timestamp e riprova.

La prima cosa che viene in mente è che vale la pena di cercare di firmare il codice .NET. Può essere che implicitamente alcune più elevato livello di sicurezza viene applicata su Win7 64 bit che richiede firmato assemblaggio riferimenti.

Inoltre si può provare a circoscrivere il problema (in nessun ordine particolare)

  • etichettare il programma da eseguire come amministratore e riprovare.
  • etichettare il programma da eseguire in "modalità XP / Win2K compatibilità"
  • dependencywalker (che ha la possibilità di caricare il programma simulare, e registrerà gli errori)

In bocca al lupo!

stavo facendo questo ibrido debug l'altro giorno e ottenuto l'errore: ''. ActiveX componente può non Crea oggetto '' vi consiglio di seguire questo articolo Debug ibridi applicazioni di Visual Basic 6.0 / Visual Basic .NET e assicurarsi che un nudo ossa esempio funziona sul vostro PC Win7 ( ho reaalise che funziona con regasm). Poi, con il bit REG LIBERO, ho studiato i seguenti link: . NET oggetto da VB6 senza l'uso di regasm.exe? e qui registrazione -Free attivazione di .NET-Based componenti: una guida

Si potrebbe provare a utilizzare / win32 di tlbexp su un sistema operativo x64.

questo post del blog

è possibile utilizzare per SxsTrace aiuto di debug del problema. Per iniziare a correre traccia “SxsTrace Trace -logfile: SxsTrace.etl” per convertire il file di log per qualcosa che si può visualizzare eseguire “SxsTrace Parse -logfile: SxsTrace.etl -outfile: SxsTrace.txt”.

Hai provato questo?

Un altra cosa è che su Vista / Windows 7 si può facilmente incorrere in UAC avete controllato che?

Sono stato in grado di utilizzare con successo le classi .Net da VB6 a Win 7-64 utilizzando i manifesti creati da Side by Side Manifest Maker . Ha una prova gratuita.

Non dimenticate di includere la versione runtime .NET che le tue classi di destinazione. Questo può essere il problema per cominciare come Win 7 viene fornito con .Net 4 Client Profile preinstallato solo.

Regasm fa molto di più di una semplice generare le chiavi di Registro di sistema necessarie TLB o.

Per esempio, è in grado di generare interfacce visibili COM, sulla base di COM tipi visibili. Regasm lo farà quando il tipo visibile COM non implementa un'interfaccia per esempio.

Avete tipi visibili COM che non implementano l'interfaccia (o non definiscono l'interfaccia COM utilizzando il ComDefaultInterfaceAttribute)?

Se è così, questo potrebbe essere il problema.

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