visual tag studio snippet instalar code autocompletar visual-studio-2010 com activex c#-4.0

visual-studio-2010 - tag - visual studio code shortcuts html



¿Cómo creo un control ActiveX(COM) en C#? (3)

OK, encontré la solución y la escribiré aquí para el bien común.

  1. Inicie VS2010 como administrador.
  2. Abra un proyecto de biblioteca de clase (exmaple - MyProject).
  3. Agregue una nueva interfaz al proyecto (vea el ejemplo a continuación).
  4. Agregue un using System.Runtime.InteropServices; al archivo
  5. Agregue los atributos InterfaceType, Guid a la interfaz.
  6. Puede generar un Guid usando Herramientas-> Generar GUID (opción 4).
  7. Agregue una clase que implemente la interfaz.
  8. Agregue los atributos ClassInterface, Guid, ProgId a la interfaz.
    La convención de ProgId es {namespace}. {Class}
  9. En la carpeta Propiedades del proyecto en el archivo AssemblyInfo, establezca ComVisible en verdadero.
  10. En el menú de propiedades del proyecto, en la pestaña de creación marca "Registrarse para la interoperabilidad COM"
  11. Construye el proyecto

ahora puede usar su objeto COM usando su ProgID.

ejemplo: el código C #:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace Launcher { [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")] public interface ILauncher { void launch(); } [ClassInterface(ClassInterfaceType.None), Guid("YYYYYYYY-YYYY-YYYY-YYYY-YYYYYYYYYYY"), ProgId("Launcher.Launcher")] public class Launcher : ILauncher { private string path = null; public void launch() { Console.WriteLine("I launch scripts for a living."); } } }

y script VB usando el COM:

set obj = createObject("PSLauncher.PSLauncher") obj.launch()

y el resultado será:

Lanzo scripts para vivir

Estoy tratando de crear un control ActiveX. Estoy usando Visual Studio 2010 (.NET 4). Necesito crear un objeto COM (en C #) y no tengo idea de cómo comenzar (qué tipo de proyecto usar, etc.)


Puede usar un proyecto de biblioteca de clase. Declare un tipo con métodos que se expondrán como un objeto COM.

Asegúrese de que el ensamblaje se haya hecho COM-visible:

Y finalmente regístralo usando regasm.exe :

regasm.exe /codebase mylib.dll

Ahora el ensamblaje está expuesto como un objeto COM y el tipo que usted declara puede ser consumido por cualquier cliente que admita COM.


Pasos de creación

  1. Inicie Visual Studio 2013 como administrador
  2. Instalar la extensión de Visual Studio Proyectos de instalador de Microsoft Visual Studio
  3. Crear un proyecto de biblioteca de clase (WinFormActivex)
  4. Crea tu formulario de ventana de ejemplo (MainWindow)
  5. Crear una nueva interfaz de componente (ILauncher)
  6. Crear una nueva interfaz de seguridad (IObjectSafety)
  7. Crea el control de componentes (Iniciador) que implementa interfaces y ejecuta la ventana.
  8. Verifique que todos los GUID sean generados por usted
  9. Verifique que el proyecto esté marcado para COM
  10. Cree el proyecto de instalación (LauncherInstaller) con la salida primaria de WinFormActivex con la propiedad Register = vsdrpCOM
  11. Instalar LauncherInstaller
  12. Ejecute su página de prueba en el explorador (test.html)

MainWindow Puedes crear un Formulario normal, aquí está pregenerado.

public partial class MainWindow : Form { public MainWindow() { InitializeComponent(); } /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.textBox2 = new System.Windows.Forms.TextBox(); this.SuspendLayout(); // // textBox1 // this.textBox1.Location = new System.Drawing.Point(42, 23); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(100, 20); this.textBox1.TabIndex = 0; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(42, 65); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(100, 20); this.textBox2.TabIndex = 0; // // MainWindow // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); this.Name = "MainWindow"; this.Text = "MainWindow"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; }

ILauncher

using System.Runtime.InteropServices; namespace WinFormActivex { [ComVisible(true)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] [Guid("94D26775-05E0-4B9C-BC73-C06FE915CF89")] public interface ILauncher { void ShowWindow(); } }

IObjectSafety

[ComImport()] [Guid("51105418-2E5C-4667-BFD6-50C71C5FD15C")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IObjectSafety { [PreserveSig()] int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions); [PreserveSig()] int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions); }

Iniciador Genere su GUID aquí.

[ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] [Guid("D100C392-030A-411C-92B6-4DBE9AC7AA5A")] [ProgId("WinFormActivex.Launcher")] [ComDefaultInterface(typeof(ILauncher))] public class Launcher : UserControl, ILauncher, IObjectSafety { #region [ ILauncher ] public void ShowWindow() { var f = new MainWindow(); f.StartPosition = FormStartPosition.Manual; f.Location = Screen.AllScreens[0].Bounds.Location; f.WindowState = FormWindowState.Normal; f.WindowState = FormWindowState.Maximized; f.ShowInTaskbar = false; f.Show(); } #endregion #region [ IObjectSafety ] public enum ObjectSafetyOptions { INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001, INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002, INTERFACE_USES_DISPEX = 0x00000004, INTERFACE_USES_SECURITY_MANAGER = 0x00000008 }; public int GetInterfaceSafetyOptions(ref Guid riid, out int pdwSupportedOptions, out int pdwEnabledOptions) { ObjectSafetyOptions m_options = ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_CALLER | ObjectSafetyOptions.INTERFACESAFE_FOR_UNTRUSTED_DATA; pdwSupportedOptions = (int)m_options; pdwEnabledOptions = (int)m_options; return 0; } public int SetInterfaceSafetyOptions(ref Guid riid, int dwOptionSetMask, int dwEnabledOptions) { return 0; } #endregion }

test.html Compruebe que su GUID de coincidencia CLSID (iniciador).

<html> <head> <objectname="activexLauncher" style=''display:none'' id=''activexLauncher'' classid=''CLSID:D100C392-030A-411C-92B6-4DBE9AC7AA5A'' codebase=''WinFormActivex''></object> <script language="javascript"> <!-- Load the ActiveX object --> var x = new ActiveXObject("WinFormActivex.Launcher"); alert(x.GetText()); </script> </head> <body> </body> </html>

Referencias