Question

J'ai un code .NET à partir du code-je utiliser VB6. J'ai toujours développé ce sur une machine XP en créant un fichier VB6.exe.manifest qui a énuméré les ensembles .NET dépendants.

Par exemple, supposons que mes 2 ensembles .NET sont Some.Assembly.A.dll et Some.Assembly.B.dll, voici ce que VB6.EXE.manifest ressemble (j'utilise la version = 1.1.0.0 ci-dessous parce que est l'ensemble version I sur la AssemblyVersion .NET dans 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>

Ensuite, ainsi que les DLL dans le même répertoire, je les assemblées et leurs propres fichiers manifestes. Voici un exemple "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>

Je également exécuter tlbexp sur DLL référencés pour créer des fichiers TLB, et voici ce que je fais référence dans mon dossier de projet VB6.

Je veux passer à un Windows 7 64 bit machine. En utilisant les mêmes méthodes, quand je frappe le code VB6 qui instancie l'objet .NET sur la machine Win7 je reçois

  

"composant ActiveX ne peut pas créer   Objet. "

Sur XP, il réussit. Si je délibérément Misspell l'assemblée à charge dans VB6.EXE.manifest - sur XP I get

  

"Cette application n'a pas pu démarrer   parce que Teh configuration de l'application   est incorrect. réinstallation de la   l'application peut résoudre ce problème. "

Win7, VB6 seulement des charges. Il est comme il ignore le manifeste sur Win7, donc je ne peux pas charger mon objet .NET à l'aide des méthodes REG GRATUIT sur Win7. Si je regasm la DLL, tout fonctionne.
Toutes les idées sur la façon de faire fonctionner VB6 avec reg libre com sur Win7 (64 BIT)?

Était-ce utile?

La solution

Avez-vous essayé d'installer simplement et en cours d'exécution VB6 en mode de compatibilité Windows XP?

Autres conseils

Si vous compilez VB6.exe ou autre traitement pour la machine à win7, vous devez savoir que certains des outils de développement plus récents intègre automatiquement un manifeste de sorte que vous pouvez vérifier que (un moyen rapide est d'ouvrir la exécutable dans VS et recherchez une ressource RT_MANIFEST avec id 1). S'il y a un manifeste noyé, manifeste externes sont ignorés, ce qui est peut-être la raison pour laquelle lorsque vous modifiez la manfiest externe, rien ne se passe et son contenu sont ignorés.

En plus de ce que Erno a dit à propos sxstrace (pourriez-vous poster les résultats que vous obtenez de sxstrace?), Assurez-vous de mettre à jour l'horodatage de VB6.exe si le manifeste est intégré dans, ou VB6.exe.manifest autrement. Vista + Win7 cache le contenu des manifestes, calées de l'horodatage du manifeste racine afin que vos modifications locales pourraient ne pas être pris en charge se. Si sxstrace vous donne des résultats blancs, mettez à jour les horodatages et essayez à nouveau.

La première chose qui vient à l'esprit est qu'il vaut la peine d'essayer de signer le code .net. Il se peut que implicitement un certain niveau de sécurité plus élevé est appliqué sur win7 64 bits qui nécessite signé l'assemblage des références.

En outre, vous pouvez essayer de cerner le problème par (sans ordre particulier)

  • étiqueter le programme à exécuter en tant qu'administrateur et nouvelle tentative.
  • Etiqueter le programme à exécuter dans "xp / Win2K mode compatibilty"
  • exécuter dependencywalker (il a une option pour simuler la charge du programme, et enregistrera les erreurs)

Bonne chance!

Je faisais cet hybride de débogage l'autre jour et obtenu l'erreur: « ». ActiveX composant peut pas créer l'objet « » Je vous suggère de suivre cet article Débogage Visual Basic 6.0 Hybrid / Visual Basic .NET Applications et assurez-vous que le fonctionnement d'un exemple des os nus sur votre PC Win7 ( Je reaalise il travaille avec regasm). Puis, avec le bit REG libre, je fait des recherches sur les liens suivants: . NET objet de VB6 sans utilisation de regasm.exe et ici Inscription -Internet activation des composants à base de .NET: une soluce

Vous pouvez essayer d'utiliser / win32 de tlbexp sur un OS 64 bits.

De ce blog

  

vous pouvez utiliser SxsTrace pour aider à résoudre le problème. Pour commencer à courir trace « SxsTrace Trace -logfile: SxsTrace.etl » pour convertir le fichier journal à quelque chose que vous pouvez voir exécuter « SxsTrace Parse -logfile: SxsTrace.etl -outfile: SxsTrace.txt ».

Avez-vous essayé?

Une autre chose est que sur Vista / Windows 7, vous pouvez facilement exécuter en avez-vous vérifié UAC que?

J'ai pu utiliser avec succès les classes .Net de VB6 dans Win 7-64 à l'aide créé par côte à côte Manifest Maker . Il a un essai gratuit.

Ne pas oublier d'inclure la version d'exécution .Net que vos cours cible. Cela peut être votre problème pour commencer que Win 7 est livré avec .Net 4 Client Profile pré-installé uniquement.

Regasm fait beaucoup plus que générer les clés de registre ou TLB nécessaires.

Par exemple, il peut générer des interfaces COM visibles, sur la base COM types visibles. Regasm le fera lorsque le COM de type visible ne met pas en œuvre une interface par exemple.

Avez-vous des COM types visibles qui ne mettent pas en œuvre une interface (ou ne définissent pas l'interface COM en utilisant le ComDefaultInterfaceAttribute)?

Dans ce cas, cela peut être votre problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top