2010-11-17 14 views
7

que han sido exitosamente capaz de ejecutar mi propio código .Net siguiendo los pasos publicados aquí Execute .NET 3.0 code from Office 2003El uso de bibliotecas estándar .Net con VBA

¿Hay una manera de utilizar las bibliotecas estándar de .NET sin tener que escribir una envoltura ? De esta forma, podemos evitar tener que registrar e instalar una DLL personalizada en el GAC en la máquina del cliente.

He encontrado tlb archivos en las carpetas C: \ Windows \ Microsof.NET \ Framework y he podido agregar una referencia a mscorlib.dll. Mirando la documentación para RijndaelManaged, esta clase parece ser COM visible.

Puedo crear una instancia, pero tan pronto como trato de trabajar con ella, obtengo errores (por ejemplo, "Tipo no coincidente").

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    Set key = aesImplementation.GenerateKey() 
    Set iv = aesImplementation.GenerateIV() 
End Sub 

Estoy dispuesto a aceptar cualquier truco que tengas que ofrecer!

+2

no tengo una respuesta re: usando. NET sin envoltorio, pero si eres nuevo en VBA, necesitas saber que declarar algo como 'nuevo' no crea nada en ese momento como lo hace en .NET. No tengo claro si tu error se plantea en la instanciación o en el 'Conjunto'. (Supongo que ha declarado su variable 'clave' como el tipo correcto, etc.) Vea http://stackoverflow.com/questions/2478097/vba-difference-in-two-ways-of-declaring-a -new-object-trying-to-understand-why/2480559 # 2480559 – jtolle

+0

Eso es una locura ¿Por qué tener una sintaxis tan nueva como válida si no crea una instancia de un nuevo objeto? Sin embargo, parece crear una instancia en este caso, recordaré al menos que "Como nuevo" no es la mejor práctica. La razón por la que no he declarado explícitamente el objeto clave es porque obtengo el error "No puedo asignar a la matriz" si lo hago. Aparentemente, este error ocurre cuando intentas asignar a una matriz de un tipo diferente. –

+1

¿No es mucho trabajo ahorrar solo un poco de trabajo? Quiero decir, si su usuario le permite ejecutar una macro, ¿por qué no ejecutar una aplicación .NET real? La interoperabilidad de Office en .NET parece bastante buena, ¡así que puedes manipular documentos igual o mejor! –

Respuesta

1

Todavía no es posible. VBA (VB para Aplicaciones) no es VB, sino más bien un trato separado que imita toda la sintaxis básica como versiones anteriores de VB. Es casi como usar una versión muy depurada de un VB normal y antiguo. De hecho, VBScript es la combinación más cercana a VBA. Tal vez algún día, Microsoft construirá métodos para trabajar directamente con el GAC, pero hasta entonces (y ese día probablemente signifique la muerte de COM, estoy seguro), está trabado con el método COM CreateObject(), agregando una referencia a un COM biblioteca registrada en su proyecto de Office o haciendo referencia directamente a un archivo DLL o TLB compatible con VBA/COM en su proyecto de Office.

Existen bastantes bibliotecas habilitadas para COM en el GAC predeterminado, pero para la mayoría, está atascado creando un Contenedor Com Callable primero en VB.Net o C#.

Por el contrario, prácticamente todas las aplicaciones de MS Office son COM Call, por lo que puede trabajar con las aplicaciones de Office instaladas a través de los proyectos de VB.Net todo lo que desee.

+3

Al agregar una referencia a 'mscorlib.dll', puede crear un objeto de cualquier clase que tenga un constructor público sin parámetros en las bibliotecas .net estándar. Encontrará esto muy limitante. – AndASM

+1

"VBScript es la coincidencia más cercana a VBA": VBA está * mucho * más cerca del VB6 clásico que de VBScript: https://msdn.microsoft.com/en-us/library/ms970436.aspx – Joe

1

Debería poder usar las clases ComVisible .NET de esta manera. Sin embargo, los métodos GenerateKey y GenerateIV no tienen un valor de retorno. Proveedores:

Sub Macro1() 
    Dim aesImplementation As New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 

o mejor, sobre todo porque al depurar puede ver si se produce un error durante la construcción o cuando se llama al método:

Sub Macro1() 
    Dim aesImplementation As RijndaelManaged 
    Set aesImplementation = New RijndaelManaged 

    aesImplementation.GenerateKey 
    Key = aesImplementation.Key 
    aesImplementation.GenerateIV 
    IV = aesImplementation.IV 
End Sub 
Cuestiones relacionadas