Pregunta

Tengo un poco de .NET código que el uso del código de VB6. Siempre he desarrollado esto en una máquina XP mediante la creación de un archivo que aparece VB6.exe.manifest los ensamblados .NET dependientes.

Por ejemplo, digamos que mis 2 ensamblados .NET son Some.Assembly.A.dll y Some.Assembly.B.dll, esto es lo que se ve como VB6.EXE.manifest (yo uso la versión = 1.1.0.0 más adelante porque eso es el conjunto de versiones que en .NET AssemblyVersion en 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>

A continuación, junto con los archivos DLL en el mismo directorio, tengo las asambleas y sus propios archivos de manifiesto. Este es un ejemplo "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>

También ejecutar tlbexp el DLL mencionados para crear archivos TLB, y esto es lo que me refiero en mi archivo de proyecto de VB6.

Quiero mover a una máquina Windows 7 BIT 64. Usando los mismos métodos, cuando pulso el código de Visual Basic 6 que crea una instancia del objeto .NET en la máquina Win7 consigo

"El componente ActiveX no puede crear Objeto ".

En XP, tiene éxito. Si deliberadamente misspell el ensamblado dependiente en VB6.EXE.manifest - en XP I get

"Esta aplicación no pudo iniciar porque teh configuración de la aplicación Es incorrecto. la reinstalación del aplicación puede solucionar este problema ".

En Win7, VB6 sólo cargas. Es como si se ignora el manifiesto en Win7, así que no puedo cargar mi objeto .NET utilizando métodos libres REG en Win7. Si regasm la DLL, todo funciona.
Cualquier ideas sobre cómo hacer el trabajo de VB6 con reg libre com en Win7 (64 bits)?

¿Fue útil?

Solución

¿Usted ha intentado la simple instalación y funcionamiento de VB6 en modo de compatibilidad Win XP?

Otros consejos

Si está volviendo a compilar VB6.exe o de otra manera procesarla para la máquina Win7, usted debe saber que algunas de las herramientas de desarrollo de nuevos incrustar automáticamente un manifiesto por lo que es posible que desee comprobar que (una forma rápida es la apertura de la ejecutables en VS, y el aspecto de un recurso RT_MANIFEST con id 1). Si hay un manifiesto incrustado, manifiestos externos se ignoran, que es posiblemente por eso que cuando se edita el manfiest externa, no pasa nada y su contenido se ignora.

Además de lo dicho sobre Erno sxstrace (que podría publicar los resultados que obtiene de sxstrace?), Asegúrese de actualizar la marca de tiempo de VB6.exe si el manifiesto está incrustado en él, o de lo contrario VB6.exe.manifest. Vista Win7 + caché el contenido de los manifiestos, cerrado de la marca de tiempo del manifiesto raíz para sus ediciones locales no podrían ser recogido. Si sxstrace le está dando resultados en blanco, actualizar las marcas de tiempo y vuelve a intentarlo.

La primera cosa que viene a la mente es que vale la pena tratar de firmar el código .NET. Puede ser que implícitamente algún nivel más alto de seguridad se aplica en Win7 64 bits que requiere el montaje firmado referencias.

Además se puede tratar de reducir el problema (en ningún orden en particular)

  • etiquetar el programa se ejecute como administrador y vuelva a intentarlo.
  • etiquetar el programa se ejecute en "modo XP / win2k compatibilty"
  • dependencywalker (que tiene una opción para simular la carga del programa, y ??registra los errores)

Buena suerte!

que estaba haciendo este híbrido depurar el otro día y tengo el error: ''. El componente ActiveX no puede crear objeto '' le sugiero que siga este artículo Depuración Híbridos aplicaciones de Visual Basic 6.0 / Visual Basic .NET y asegurarse de que una desnudos huesos obras de ejemplo en su PC Win7 ( me reaalise funciona con regasm). Luego, con el bit GRATIS REG, he investigado los siguientes enlaces: . objeto NET de VB6 sin el uso de regasm.exe? y aquí de registro -Libre la activación de .NET-Based componentes: A Tutorial

Se podría tratar de usar / win32 de tlbexp en un sistema operativo de 64 bits.

esta entrada del blog

Puede utilizar SxsTrace para ayudar a depurar el problema. Iniciar la ejecución del rastro “SxsTrace traza -logfile: SxsTrace.etl” para convertir el archivo de registro a algo que se puede ejecutar Vista “SxsTrace Analizar -logfile: SxsTrace.etl -outfile: SxsTrace.txt”.

¿Has probado esto?

Otra cosa es que en Vista / Windows 7 se puede ejecutar fácilmente en UAC ¿verificó que?

he podido utilizar con éxito las clases de .NET desde Visual Basic 6 en Win 7-64 usando los manifiestos creados por Side by Side Manifiesto fabricante. Tiene una versión de prueba gratuita.

No se olvide de incluir la versión de tiempo de ejecución .Net que sus clases objetivo. Eso puede ser su problema, para empezar como Windows 7 viene con .Net 4 Client Profile solamente preinstalado.

Regasm hace mucho más que simplemente generar las claves de registro necesarias TLB o.

Por ejemplo, puede generar las interfaces COM visibles, basado en COM tipos visibles. Regasm lo hará cuando el tipo visibles COM no implementa una interfaz, por ejemplo.

¿Tiene alguna tipos visibles COM que no implementan una interfaz (o no definen la interfaz COM mediante el uso de la ComDefaultInterfaceAttribute)?

Si es así, esto puede ser su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top