2009-11-14 17 views
5

Estoy intentando llamar a un método que he escrito en C# desde VBScript.No se puede llamar al código C# de vbscript - Error de ActiveX

He seguido casi todas las instrucciones que puedo encontrar en la web y sigo teniendo problemas.

Específicamente estoy recibiendo

Error: ActiveX component can't create object

Code: 800A01AD

Hasta ahora he hecho lo siguiente:

  1. Conjunto ComVisible(true)
  2. registrado utilizando regasm /codebase
  3. fuerte llamado mi ensamblaje
  4. confirmó que está en el registro y apunta a la corre ubicación ct
  5. hizo la clase pública
  6. no cuentan con métodos estáticos
  7. hizo el método que yo quiero llamar pública
  8. tener un constructor sin parámetros
  9. explícitamente definido un GUID

Mis VBScript miradas como este:

set oObject = CreateObject("TTTTTT.FFFFF.CCCCCCCCC") 

My C# code l Ooks como este:

using System; 
using System.IO; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace XXXXX.YYYYY 
{ 
    [ComVisible(true)] 
    [Guid("3EB62C37-79BC-44f7-AFBD-7B8113D1FD4F")] 
    [ProgId("TTTTTT.FFFFF.CCCCCCCCC")] 
    public class CCCCCCCCC 
    { 
     public void MyFunc() 
     { 
      // 
     } 
    } 
} 

¿Alguien puede ayudar?

+0

Podría publicar la declaración de clase para la clase C#, incluyendo la declaración de espacios de nombres adjunta y cualquier atributo de la clase? – itowlson

+0

Hola, he actualizado mi pregunta con mi código. – Grant

+0

¿Has visto http://stackoverflow.com/questions/769332/how-to-call-c-dll-function-from-vbscript? – abatishchev

Respuesta

2

Aquí hay un proyecto simple con solo unos pocos pasos para comenzar.

código C#:

using System; 
using System.Reflection; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 

[assembly:System.CLSCompliant(true)] 
[assembly: ComVisible(true)] 
// The following GUID is for the ID of the typelib if this project is exposed to COM 
[assembly: Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b0")] 

namespace Cheeso.ComTests 
{ 
    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b1")] 
    public class TestReply 
    { 
     public string salutation; 
     public string name; 
     public string time; 
    } 

    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b2")] 
    public class TestObj 
    { 
     // ctor 
     public TestObj() {} 

     public TestReply SayHello(string addressee) 
     { 
      return SayHello(addressee, "hello"); 
     } 

     public TestReply SayHello(string addressee, string greeting) 
     { 
      string x = String.Format("{0}, {1}!", greeting, addressee); 
      Console.WriteLine("{0}", x); 

      TestReply r = new TestReply 
      { 
       salutation = greeting, 
       name = addressee, 
       time = System.DateTime.Now.ToString("u") 
      }; 
      return r; 
     } 
    } 
} 

VBScript código del cliente:

Function Main() 
    Dim obj 
    Dim reply 
    set obj = CreateObject("Cheeso.ComTests.TestObj") 
    Set reply = obj.SayHello("Evgeny") 
    WScript.Echo "Reply at: " & reply.time 
    Set reply = obj.SayHello_2("Evgeny", "wassup") 
    WScript.Echo "Reply at: " & reply.time 
End Function 

Main 

Para construir:

(produce your .snk file, once) 
csc.exe /t:library /debug+ /keyfile:Foo.snk /out:TestObj.dll TestObj.cs 
regasm /codebase TestObj.exe 

A continuación, sólo ejecute el VBScript (a través de cscript.exe).

Una vez que lo básico funciona, puede modificarlo, agregar GAC, explicitar typelib, agregar un ProgId explícito, y así sucesivamente.

ps: FYI, este ejemplo muestra lo que ocurre con los métodos .NET sobrecargados en una clase registrada para la interoperabilidad. Hay un _2 (_3, _4, etc.) implícito agregado al nombre del método.

+0

+1 para obtener un ejemplo completo. – rekire

+0

En el sistema operativo x64 puede que tenga que crear un archivo .reg usando la opción/regfile en regasm y luego importarlo manualmente. De lo contrario, no había claves CLSID \ {GUID} correspondientes en el registro, estaban en HKCR \ Wow6432Node \ CLSID \ {GUID} –

4

¿Ha leído este artículo: COM Interop Exposed

En el last page (3) del artículo, hay una lista:

  1. Definir una interfaz .NET para los métodos que desee exponer a COM.
  2. Asigne un GUID a esa interfaz con el atributo "Guid".
  3. Haga que su clase implemente su interfaz como la primera interfaz.
  4. Asigne un GUID a esa clase con el atributo "Guid".
  5. Añadir la "ClassInterface(ClassInterfaceType.None)" atributo para evitar regasm/TlbExp de la creación de una interfaz por defecto vacío .
  6. Código duro de un número de versión específico en su atributo AssemblyVersion.
  7. Cree un par de claves de nombre seguro para su conjunto y apúntelo mediante el atributo AssemblyKeyFile.
  8. Añadir su ensamblado en la GAC,
  9. Registre su ensamblaje para COM por usando el comando Regasm junto con la opción "/ TLB" para generar una biblioteca de tipos COM .

No estoy seguro de si el GAC y ClassInterfaceType.None son las piezas que faltan de su rompecabezas, es posible que desee probarlo. ¡Buena suerte!

+0

gracias por su respuesta o.k.w. Revisé todos los artículos del artículo y desafortunadamente sigo recibiendo el mismo error. – Grant

+0

Quizás pueda codificar desde cero un componente de esos códigos de muestra y ver si funciona. Si no es así, tal vez el problema se encuentre en otro lugar y no en tu código.Lo siento, no pude ofrecer más ayuda. –

+0

enlaces están rotos – bluish

4

No hay nada realmente malo con su código y usted siguió el procedimiento de instalación correcto, por el sonido. Sin embargo, el código de error que se obtiene indica claramente que el intérprete de guiones tiene problemas para localizar o cargar el ensamblaje. La mejor forma de solucionar este problema es con la utilidad ProcMon de SysInternals.

me encontré con su código sin problemas, éstos eran los más relevantes entradas en el registro de ProcMon:

22 12:04:41.1795038 PM WScript.exe 55280 RegOpenKey HKCR\TTTTTT.FFFFF.CCCCCCCCC SUCCESS Desired Access: Read 
26 12:04:41.1795682 PM WScript.exe 55280 RegOpenKey HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID SUCCESS Desired Access: Read 
29 12:04:41.1796996 PM WScript.exe 55280 RegQueryValue HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID\(Default) SUCCESS Type: REG_SZ, Length: 78, Data: {3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F} 
34 12:04:41.1797653 PM WScript.exe 55280 RegOpenKey HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F} SUCCESS Desired Access: Read 
62 12:04:41.1802539 PM WScript.exe 55280 RegOpenKey HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32 SUCCESS Desired Access: Read 
71 12:04:41.1804181 PM WScript.exe 55280 RegQueryValue HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\(Default) SUCCESS Type: REG_SZ, Length: 24, Data: mscoree.dll 
824 12:04:41.2425662 PM WScript.exe 55280 RegQueryValue HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\1.0.0.0\CodeBase SUCCESS Type: REG_SZ, Length: 124, Data: file:///c:/projects/ClassLibrary2/obj/Debug/ClassLibrary2.DLL 
... Lots of .NET keys... 
1239 12:04:41.2970169 PM WScript.exe 55280 CreateFile C:\projects\ClassLibrary2\obj\Debug\ClassLibrary2.dll SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 
0

puede ser, todos sus problemas son causados ​​por VS. Intente compilar su biblioteca desde la línea de comandos escribiendo

csc.exe /t:library AClass.cs /keyfile:Foo.snk - produce your key file with VS! 
regasm /codebase /tlb AClass.dll 

VS están añadiendo algunas cosas como/advierten:/noconfig y así sucesivamente, y también la adición de referencias a otros montajes como System.Core y así sucesivamente, y a veces causa los errores. Para mí, compilando desde csc trabajado.

Cuestiones relacionadas