visual objeto net instanciar inicializar declarar c# .net vba com com-interop

net - No se puede crear una instancia de un objeto COM escrito en C#desde VBA(VB6 está bien)



inicializar un objeto vb net (5)

Esto funciona para mí desde VBA ... Lo intenté con Word & Excel 2003 (SP3).

No estoy seguro de lo que quiere decir con máquina de "producción". Porque esta es una aplicación de "cliente" y debe ejecutarse en el cliente utilizando Excel.

Si está automatizando Excel en el servidor y activando esta "interoperabilidad" a través de una llamada VBA, está buscando problemas :)

Suponiendo que por producción, se refiera a la máquina del cliente donde el usuario utilizará la plantilla / documento de Excel, estos son los siguientes punteros:

  1. Asegúrate de tener el marco .Net apropiado
  2. Que tiene los últimos service packs para Office
  3. Intente averiguar si esto es un problema de derechos.

Si te sientes aventurero, puedes usar un explorador de procesos [desde el sitio sysinternals de Microsoft] para ver cuáles son los archivos DLL cargados y dónde exactamente obtienes el error y compararlo con la lista en tu cuadro de desarrollo.

Espero que esto ayude.

Usando VS 2008, aquí está mi objeto COM

using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Windows.Forms; namespace TestCom { [Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E")] [ClassInterface(ClassInterfaceType.AutoDual)] [ProgId("Test9.COMINT")] public class TestComClass { public void Init(string userid, string password) { MessageBox.Show(string.Format("{0}/{1}", userid, password)); } } }

Si construyo esto y lo registro en una máquina de producción de la siguiente manera

REGASM /CODEBASE TESTCOM.DLL

Desde una simple aplicación VB6, esto funciona bien

Private Sub Form_Load() Dim o As Object Set o = CreateObject("Test9.COMINT") o.Init "A", "B" End Sub

Este mismo código exacto llamado desde VBA en Excel da

"error de automatización" (0x80131700)

Todo funciona bien en una máquina de desarrollo, pero no en una máquina de producción con solo .NET y MS Office instalados.

Actualizar

Creo que esto tiene algo que ver con que el framework .NET no se haya inicializado correctamente, cuando se ejecuta bajo Excel. Si utilizo Filemon, puedo verlo omitir buscando MSCORWKS.DLL. Cuando llamo al mismo objeto desde VBScript, encuentra que MSCorwks.dll está bien.

Cuando llamé a CorBindToCurrentRunTime de VBA para intentar cargar forzosamente el CLR, curiosamente obtengo exactamente el mismo HRESULT (0x80131700) que cuando hago CreateObject() en VBA.

Por lo tanto, creo que es un problema de inicialización del framework.


RC1, probé esto con su código de VBScript y desde Office 2007''s Excel, todo funciona bien.

Como puede crear el objeto COM desde un formulario VB6, deberíamos suponer que su .NET Framework está bien. ¿Puedes descartar problemas con VBA? ¿Puedes crear un archivo .vbs y poner esto en él?

Dim o As Object Set o = CreateObject("Test9.COMINT") o.Init "A", "B"

Guarde el archivo y haga doble clic en él. Si obtiene un error, entonces creo que hay un problema con el registro, si no obtiene un error, entonces miro en Office y VBA y veo si falta algo o no está instalado correctamente.

Otra opción es agregar una referencia al objeto COM y usar el enlace anticipado. Creo que es posible que necesite exportar primero una biblioteca de tipos, pero debería poder agregar una referencia y un nuevo objeto simple.


Voy a responder mi propia pregunta, espero poder ahorrarles a los demás las tediosas horas que acabo de soportar.

Si obtiene esto, es porque el ensamblado COM basado en .NET no puede encontrar el marco .NET

La solución es simple. Crea un archivo que contenga lo siguiente

<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v2.0.50727"/> </startup> </configuration>

Llámalo "Excel.Exe.Config" y colócalo en el mismo directorio que "EXCEL.EXE"

¡Problema resuelto!



rc1 es correcto en cuanto a que se trata de un error .NET, lanzado cuando Office no puede decidir qué versión del Framework usar. Sin embargo, Office no está dando tumbos simplemente porque tiene muchas opciones. Existe un error en la forma en que Office 2003 interactúa con .net 2.0.

Instalar el arreglo de Microsoft ( KB908002 ) es una forma más flexible de resolver el problema que forzar a Excel a ejecutar en una versión particular de .NET.

Ver también: http://www.biopdf.com/guide/trouble_shoot_microsoft_office_2003.php