Как создать элемент управления ActiveX (COM) на C #?

Я пытаюсь создать элемент управления ActiveX. Я использую Visual Studio 2010 (.NET 4). Мне нужно создать COM- объект (в C #) и не знаю, как начать (какой тип проекта использовать и т. Д.)

ОК, я нашел решение, и я напишу его здесь для общего блага.

  1. Запустите VS2010 как администратор.
  2. Откройте проект библиотеки classов (exmaple – MyProject).
  3. Добавьте новый интерфейс в проект (см. Пример ниже).
  4. Добавьте using System.Runtime.InteropServices; к файлу
  5. Добавьте атрибуты InterfaceType, Guid в интерфейс.
  6. Вы можете создать Guid с помощью Tools-> Generate GUID (вариант 4).
  7. Добавьте class, реализующий интерфейс.
  8. Добавьте в интерфейс атрибуты ClassInterface, Guid, ProgId.
    Соглашение ProgId – {namespace}. {Class}
  9. В папке «Свойства» в проекте в файле AssemblyInfo установите ComVisible в true.
  10. В меню свойств проекта в закладке сборки отметьте «Регистрация для COM-взаимодействия»,
  11. Построить проект

теперь вы можете использовать свой COM-объект, используя его ProgID.

Пример: код 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."); } } } 

и скрипт VB с использованием COM:

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

и выход будет:

Я запускаю сценарии для жизни

Шаги создания

  1. Запустите Visual Studio 2013 как администратор
  2. Установка расширения Visual Studio Microsoft Visual Studio Installer Projects
  3. Создайте проект библиотеки classов (WinFormActivex)
  4. Создайте свой пример формы windows (MainWindow)
  5. Создайте новый интерфейс компонента (ILauncher)
  6. Создайте новый интерфейс безопасности (IObjectSafety)
  7. Создайте элемент управления компонентом (Launcher), который реализует интерфейсы и запускает окно.
  8. Убедитесь, что все GUID генерируются вами
  9. Убедитесь, что проект отмечен для COM
  10. Создайте проект установки (LauncherInstaller) с основным выходом WinFormActivex со свойством Register = vsdrpCOM
  11. Установить LauncherInstaller
  12. Запустите тестовую страницу в explorer (test.html)

MainWindow Вы можете создать обычную форму, здесь предварительно сгенерированы.

 public partial class MainWindow : Form { public MainWindow() { InitializeComponent(); } ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  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); } 

Launcher Пожалуйста, создайте свой GUID здесь.

  [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 Убедитесь, что ваш идентификатор CLSID (Launcher) GUID.

    

Рекомендации

  • Вопрос переполнения стека Я всегда использую в качестве ссылки
  • Тег Activex, который вы должны прочитать
  • Старый советник Microsoft
  • Статья о создании управления acrivex с параметрами безопасности
  • Статья о создании windows

Вы можете использовать проект библиотеки classов. Объявите тип с методами, которые будут отображаться как COM-объект.

Убедитесь, что assembly сделана COM-видимой:

alt text

И, наконец, зарегистрируйте его с помощью regasm.exe :

 regasm.exe /codebase mylib.dll 

Теперь assembly отображается как COM-объект, и объявленный вами тип может быть использован любым клиентом, поддерживающим COM.

  • Mercurial .hgignore для проектов Visual Studio 2010
  • Приложение WPF из Visual Studio 2010 выходит из строя Windows 7
  • Почему этот код Parallel.ForEach заморозит программу?
  • Не удалось найти имя типа или имени пространства
  • Изменения в базе данных Access не сохраняются при запуске приложения в Visual Studio
  • Ошибка «LINK: фатальная ошибка LNK1123: сбой при преобразовании в COFF: файл недействителен или поврежден» после установки Visual Studio 2012 Release Preview
  • Тип или имя пространства имен не существует
  • Измените проект C ++ / CLI на другую структуру, чем 4.0 с помощью vs2010
  • Не удается запустить веб-приложение ASP.NET MVC 2 на IIS 7.5
  • NUnit не запускает код Visual Studio 2010
  • Установка Visual Studio 2010 (любая версия) устанавливает только 2 файла в каталоге заголовков C ++
  • Давайте будем гением компьютера.