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:
- Asegúrate de tener el marco .Net apropiado
- Que tiene los últimos service packs para Office
- 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!
la instalación del siguiente arreglo resolverá este problema http://www.microsoft.com/downloads/details.aspx?FamilyID=1b0bfb35-c252-43cc-8a2a-6a64d6ac4670&displaylang=en
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