c# .net vb6 interop regfreecom

c# - Reg Free Com con VB6 en Windows 7



.net interop (8)

¿Ha intentado simplemente instalar y ejecutar VB6 en modo compatible con WinXP?

Tengo un código .NET que utilizo desde el código VB6. Siempre he desarrollado esto en una máquina XP creando un archivo VB6.exe.manifest que enumera los ensamblados .NET dependientes.

Por ejemplo, digamos que mis 2 ensamblajes .NET son Some.Assembly.A.dll y Some.Assembly.B.dll, así es como se ve VB6.EXE.manifest (uso la versión = 1.1.0.0 a continuación porque esa es la versión Me puse 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>

Luego, junto con las DLL en el mismo directorio, tengo los ensamblados y sus propios archivos de manifiesto. Aquí hay 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 ejecuto tlbexp en archivos DLL a los que se hace referencia para crear archivos TLB, y esto es lo que hago referencia en mi archivo de proyecto VB6.

Quiero pasar a una máquina de Windows 7 64 BIT. Usando los mismos métodos, cuando golpeo el código VB6 que crea una instancia del objeto .NET en la máquina WIN7, obtengo

"El componente ActiveX no puede crear objeto".

En XP, tiene éxito. Si a propósito escribo incorrectamente el ensamblado dependiente en VB6.EXE.manifest, en XP obtengo

"Esta aplicación no pudo iniciarse porque la configuración de la aplicación es incorrecta. Reinstalar la aplicación puede solucionar este problema".

En WIN7, VB6 solo carga. Es como si ignorara el manifiesto en WIN7, así que no puedo cargar mi objeto .NET usando los métodos REG FREE en WIN7. Si regasm la DLL, todo funciona.
¿Alguna idea sobre cómo hacer que VB6 funcione con reg free com en WIN7 (64 BIT)?


De esta entrada de blog

puede utilizar SxsTrace para ayudar a depurar el problema. Para iniciar el seguimiento, ejecute “SxsTrace Trace -logfile: SxsTrace.etl” para convertir el archivo de registro en algo que pueda ver ejecute “SxsTrace Parse -logfile: SxsTrace.etl -outfile: SxsTrace.txt”.

¿Has probado eso?

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


Estaba haciendo esta depuración híbrida el otro día y obtuve el error: '''' El componente ActiveX no puede crear objetos ''''. Le sugiero que siga este artículo sobre depuración de aplicaciones híbridas de Visual Basic 6.0 / Visual Basic .NET y asegúrese de que sea un ejemplo. Funciona en tu PC con Win7 (Realojalo funciona con regasm). Luego, con el bit REG FREE, investigué los siguientes enlaces: ¿ Objeto .NET de VB6 sin usar regasm.exe? y aquí Activación sin registro de componentes basados ​​en .NET: un tutorial


He podido usar exitosamente las clases .Net de VB6 en Win 7-64 usando manifiestos creados por Side by Side Manifest Maker . Tiene una versión de prueba gratuita.

No se olvide de incluir la versión en tiempo de ejecución .Net a la que apuntan sus clases. Ese puede ser su problema para comenzar, ya que Win 7 viene con .Net 4 Client Profile solo preinstalado.


Lo primero que viene a la mente es que vale la pena intentar firmar el código .net. Puede ser que implícitamente se aplique un nivel más alto de seguridad en win7 de 64 bits que requiere referencias de ensamblaje firmadas.

Además, puede intentar reducir el problema (sin ningún orden en particular)

  • etiqueta el programa para que se ejecute como administrador y vuelva a intentarlo.
  • etiqueta el programa para que se ejecute en "modo compatibilidad xp / win2k"
  • ejecútelo en dependencywalker (tiene una opción para simular la carga del programa y registrará los errores)

¡Buena suerte!


Puede intentar usar la opción / win32 de tlbexp en un sistema operativo x64.


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

Por ejemplo, puede generar interfaces visibles COM, basadas en los tipos visibles COM. Regasm hará esto cuando el tipo visible de COM no implemente una interfaz, por ejemplo.

¿Tiene algún tipo de COM visible que no implementa una interfaz (o no la define mediante el ComDefaultInterfaceAttribute)?

Si es así, este puede ser tu problema.


Si está volviendo a compilar vb6.exe o si no lo está procesando para la máquina win7, debe saber que algunas de las herramientas de desarrollo más recientes incorporan automáticamente un manifiesto, por lo que es posible que desee verificarlo (una forma rápida es abrir el ejecutable en VS , y busque un recurso RT_MANIFEST con id 1). Si hay un manifiesto incrustado, se ignoran los manifiestos externos, que es posiblemente el motivo por el que cuando edita el administrador externo, no ocurre nada y se ignora su contenido.

Además de lo que dijo Erno sobre sxstrace (¿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 VB6.exe.manifest de lo contrario. Vista + Win7 almacena en caché el contenido de los manifiestos, borrado de la marca de tiempo del manifiesto de raíz para que sus ediciones locales no sean recogidas. Si sxstrace le está dando resultados en blanco, actualice las marcas de tiempo y vuelva a intentarlo.