c# visual-studio-2010 dll activex

c# - Error de DLL ActiveX



visual-studio-2010 (1)

Pude hacer que esto funcionara tanto a través de IE como de vbscript al hacer lo siguiente:

  1. Crear una biblioteca de clases .NET llamada ''ActiveXTest''
  2. Agregue una clase llamada MyObject que se define de la siguiente manera:

    namespace ActiveXTest { [System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ProgId("ActiveXTest.MyObject")] [System.Runtime.InteropServices.Guid("df2dac4d-ba8a-4ecc-b76e-958c1bc32f1f")] public class MyObject { public string HelloWorld() { return "This is Hello World from the COM component!"; } } }

  3. Compila la clase. Vaya a la carpeta donde compiló la clase y haga lo siguiente desde el símbolo del sistema de Visual Studio: regasm / codebase ActiveXTest.dll

  4. Para probar desde un script .vbs, cree un archivo en el Bloc de notas llame a test.vbs. escriba lo siguiente en el archivo:

    Dim myObject set myObject = CreateObject("ActiveXTest.MyObject") MsgBox(myObject.HelloWorld)

Abra un símbolo del sistema y navegue hasta donde creó Test.vbs y escriba: wscript test.vbs. Se debe mostrar un diálogo que diga "Esto es Hellow World desde el componente COM"

  1. Para probar esto desde IE, creé un archivo TEST.HTML con los siguientes contenidos:

    <HTML> <HEAD> <script language="JScript" language="JavaScript"> var obj = new ActiveXObject("ActiveXTest.MyObject"); alert(obj.HelloWorld()); </script> </HEAD> <body> <span>nothing to see here!</span> <body> </HTML>

Abra el archivo TEST.HTML en IE. Recibirá una advertencia sobre el control ActiveX; solo diga Sí para permitir la interacción. Obtendrá un cuadro de diálogo de alerta que indica "Esto es Hello World desde el Componente COM".

Se pueden usar pasos similares para hacer que funcione desde un archivo .js o desde Excel VBA. Tenga en cuenta que si cambia la firma del método COM del ensamblaje ActiveX, creo que necesitará volver a registrarlo.

Está bien, aunque nunca pensé que en 2012 estaría escribiendo mi primer control ActiveX (y sí, hay una buena razón para ello). Tengo problemas para que funcione en Windows 7 (x64).

La Solución Breve Historia: Me faltaba / codebase de algunas de mis llamadas regasm y también mezclando procesos de 32 y 64 bits, pero eso no fue ayudado por el símbolo del sistema estándar VS2010 mezclando rutas de 32 y 64 bit para regasm y cscript .

La larga historia sigue:

He estado rebotando entre

Creando un control ActiveX en .Net usando C #

( Vaya , tenía el enlace equivocado ... aunque parece que el enlace que proporcioné inicialmente fue alguien que copió la página original del blog)

Creando un control ActiveX en .Net usando C #

y

C ActiveX control (CSActiveX)

Y parece que estoy construyendo los proyectos con éxito (para este último tuve que cambiar la ubicación del compilador de recursos a la ubicación correcta).

Para el primer proyecto estoy usando el instalador sugerido, para el segundo proyecto estoy tratando de usar regasm directamente.

Pero después de esto, todo se vuelve cuesta abajo. Intento registrar el todo pero o bien:

  1. No tengo idea de cómo debería registrarlos, o:
  2. No tengo idea de cómo debería registrarlos.

Mi caso de prueba ha sido un archivo JScript simple que contiene

var x = new ActiveXObject( "name of object" );

Que falla con el error:

test.js (1,1) Error de tiempo de ejecución de Microsoft JScript: Automation Server no puede crear objetos

No estoy seguro de si esto es un problema de permisos, o un problema de 32 contra 64 bits o una combinación.

Muchos sitios que ofrecen ayuda sobre ActiveX suponen que accederá a ellos a través de una página web, por lo que he intentado ver los permisos de IE (aunque quiero cargar el control en un programa de tercera parte).

Sé que si uso las versiones ''framework'' o ''framework64'' de regasm, puedo controlar dónde se colocan las entradas del registro, y he visto algunas referencias a ejecutar cscript como 32 o 64 bits (lo que puede afectar qué parte de se busca el registro) según el intérprete de comandos cmd invocado (y lo he intentado de ambas formas, además de probar un intérprete de comandos "administrador").

Entonces, básicamente, en este momento no tengo idea de lo que estoy haciendo o de lo que debería estar haciendo.

Mi objetivo es registrar un control ActiveX en Windows 7 x64 y que pueda ser cargado por:

  1. Un script de prueba .js ejecutándose desde el símbolo del sistema predeterminado de Windows
  2. Cargue el mismo control en algo como Excel 2007 VBA (solo para prueba)
  3. Cargue el control en una aplicación de 3ra parte (RSView Studio de Rockwell) y hágalo alojado dentro de una aplicación de VBA (y necesito verificar si se trata de un programa de 32 o 64 bits ... sospecho que el primero)

Notas

Para el proyecto que los usuarios instalan (Creando un control ActiveX en .Net usando C #), instala el código en "c: / Archivos de programa (x86) /" y mirando con regedit, encuentro entradas en "Computer / HKEY_CLASSES_ROOT / Wow6432Node / CLSID / ", que creo que me está diciendo que el archivo DLL se instaló como un proceso de 32 bits. He intentado ejecutar mi prueba de cscript desde un cmd de 32 y 64 bits y ambos fallan. TEN EN CUENTA que el instalador estaba creando el equivalente de "regasm / codebase" cuando se ejecutó.

Para el proyecto en el que traté de usar regasm para registrarlo (control C # ActiveX (CSActiveX)), tiene un código adicional para registrar un control COM de ActiveX. Este código menciona el registro de servidores de proceso de 32 bits (ver ActiveXCtrlHelpers.cs)

(Por cierto, también estoy maldiciendo la corrección automática en Safari / Lion en este momento, sigue cambiando la minúscula "DLL" en "todo")

Editar 2012-08-07

Impulsado por la respuesta de Art descubrí:

Desde el indicador de comando VS2010 estándar

Al ejecutar ''regasm / codebase'' a través del símbolo del sistema VS2010 estándar (y como administrador para permitir que regasm realice cambios), las entradas se volcaron en el registro en HKEY_CLASSES_ROOT / Wow6432Node / CLSID y las secuencias de comandos de prueba fallaron desde el mismo aviso.

Sin embargo, puedo ver el control ActiveX en Excel 2007 (32 bit)

Desde el símbolo del sistema x64 Win64 VS2010

Cuando se ejecutaba bajo el símbolo del sistema VS2010 x64 Win64 (de nuevo como administrador), las entradas de registro aparecían bajo HKEY_CLASSES_ROOT / CLSID, pero esta vez los scripts de prueba funcionaban desde el mismo aviso y también desde un cmd estándar de Windows (sin embargo fallan desde un indicador de 32 bits )

¡¡Pero!! No puedo ver el control X activo de Excel 2007 (32 bit)

Ahora solo necesito averiguar cuál es el equivalente de windows del comando * nix ''which'' para asegurar qué regasmo estoy usando) el comando ''where''

Mirando las instrucciones del comando VS2010 y Windows 7:

VS2010 (standard prompt): cscript => c:/windows/system32/cscript.exe regasm => c:/windows/Microsoft.net/framework/v4.0.30319/regasm.exe VS2010 (x64 Win 64): cscript => c:/windows/system32/cscript regasm => c:/windows/Microsoft.net/framework64/v4.0.30319/regasm.exe Windows 7 std. prompt: cscript => c:/windows/system32/cscript.exe Windows 7 32 bit prompt: cscript => c:/windows/SysWOW64/cscript.exe

Todo esto está empezando a hacer que parte de mi confusión sea comprensible. Sin saberlo, he estado mezclando y combinando sistemas de 32 y 64 bits, ¡pero el sistema estándar VS2010 tampoco me ayudó!

(y mi último inconveniente: VS2010 guardando archivos como UTF-8 con BOM)