Превратите простую C # DLL в компонент взаимодействия COM - PullRequest
63 голосов
/ 17 августа 2011

Как превратить C # DLL в библиотеку COM-взаимодействия, которая может использоваться приложением VB6?

Ответы [ 4 ]

85 голосов
/ 17 августа 2011

Это ответ, который я хотел найти в StackOverflow, но не смог. Оказывается, довольно просто превратить простой C # dll в COM dll.

Для создания C # dll

Создайте решение с проектом класса C #. Класс должен иметь интерфейс для свойств / методов и интерфейс для событий. Присвойте атрибуты GUID классу и интерфейсам, как описано в MSDN - Пример класса COM (Руководство по программированию в C #) . См. Также: MSDN. Практическое руководство. Создание событий, обрабатываемых приемником COM .

.

В Свойствах проекта> вкладка «Приложение»> кнопка «Информация о сборке»> установите флажок «Сделать сборку видимой». Это делает все открытые методы в классе COM видимыми.

В Свойствах проекта> вкладка «Сборка»> установите «Цель платформы» на x86.

Это все, что вам нужно сделать, чтобы создать DLL. Чтобы позвонить в DLL, необходимо зарегистрировать ее.

Регистрация DLL на компьютере разработчика

Вы можете зарегистрировать DLL одним из следующих способов:

  • Проверьте свойства проекта> вкладка «Сборка»> «Зарегистрироваться для взаимодействия COM». Это автоматически зарегистрирует DLL при ее создании.
  • Зарегистрируйте DLL вручную с помощью RegAsm. Это позволяет вам зарегистрировать DLL в каталоге по вашему выбору, а не в каталоге сборки. Это метод, который я использовал.

    • Не проверять Свойства проекта> Вкладка «Сборка»> «Зарегистрироваться для COM-взаимодействия»
    • Скопируйте DLL в каталог, где вы хотите ее зарегистрировать
    • Откройте командную оболочку с правами администратора и введите

      RegAsm.exe -tlb -codebase mydll.dll
      

      RegAsm.exe находится в "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727", а mydll.dll - это имя вашей DLL; tlb означает «создать библиотеку типов»; codebase означает «записать каталог в Реестр, предполагая, что он не помещается в GAC».

      RegAsm отобразит предупреждение о том, что сборка должна иметь строгое имя. Вы можете игнорировать это.

      На этом этапе вы сможете добавить ссылку на библиотеку COM в VB6, просмотреть ее с помощью Intellisense и запустить как обычную библиотеку COM.

Установка DLL с помощью InstallShield

Если вы используете InstallShield для установки DLL вместе с остальной частью вашего приложения, сделайте следующее.

В InstallShield добавьте новый компонент в список компонентов. Не забудьте связать Компонент с Функцией. Установите для свойства компонента ".NET COM Interop" значение Да.

Добавьте файл .dll в раздел «Файлы» компонента. Не проверяйте свойство «Самостоятельная регистрация». Щелкните правой кнопкой мыши по файлу .dll и выберите «Установить ключевой файл».

Добавьте файл .tlb в раздел «Файлы» компонента. Проверьте свойство «Самостоятельная регистрация».

На целевом ПК должна существовать правильная версия .Net Framework.

Вот и все.

4 голосов
/ 06 апреля 2017

Как расширение @ ответ Киерена Джонстона практический пример кода для модификаций классов, которые вам нужно сделать:

От:

public class ApiCaller 
{

    public DellAsset GetDellAsset(string serviceTag, string apiKey)
    {
     ....
    }
}

public class DellAsset
{
    public string CountryLookupCode { get; set; }
    public string CustomerNumber { get; set; }
    public bool IsDuplicate { get; set; }
    public string ItemClassCode { get; set; }
    public string LocalChannel { get; set; }
    public string MachineDescription { get; set; }
    public string OrderNumber { get; set; }
    public string ParentServiceTag { get; set; }
    public string ServiceTag { get; set; }
    public string ShipDate { get; set; }

}

Кому:

[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
[ComVisible(true)]
public interface IComClassApiCaller
{
    IComClassDellAsset GetDellAsset(string serviceTag, string apiKey);

}

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IComClassApiCallerEvents
{
}

[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(IComClassApiCallerEvents))]
[ComVisible(true)]
[ProgId("ProgId.ApiCaller")]
public class ApiCaller : IComClassApiCaller {

    public IComClassDellAsset GetDellAsset(string serviceTag, string apiKey)
    {
        .....
    }
}


[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83E")]
[ComVisible(true)]
public interface IComClassDellAsset
{
     string CountryLookupCode { get; set; }
     string CustomerNumber { get; set; }
     bool IsDuplicate { get; set; }
     string ItemClassCode { get; set; }
     string LocalChannel { get; set; }
     string MachineDescription { get; set; }
     string OrderNumber { get; set; }
     string ParentServiceTag { get; set; }
     string ServiceTag { get; set; }
     string ShipDate { get; set; }

}

[Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA70"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IComClassDellAssetEvents
{
}

[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F937"),
    ClassInterface(ClassInterfaceType.None),
    ComSourceInterfaces(typeof(IComClassDellAssetEvents))]
[ComVisible(true)]
[ProgId("ProgId.DellAsset")]
public class DellAsset : IComClassDellAsset
{
    public string CountryLookupCode { get; set; }
    public string CustomerNumber { get; set; }
    public bool IsDuplicate { get; set; }
    public string ItemClassCode { get; set; }
    public string LocalChannel { get; set; }
    public string MachineDescription { get; set; }
    public string OrderNumber { get; set; }
    public string ParentServiceTag { get; set; }
    public string ServiceTag { get; set; }
    public string ShipDate { get; set; }

}

Надеюсь, это сэкономит вам время

1 голос
/ 31 июля 2015

У Microsoft есть быстрый способ здесь . Тем не менее, вам нужно зарегистрировать DLL. Чтобы сделать вашу C # dll более похожей на простую C dll (C # Unmanaged Exports), используйте этот метод, который подробно описан здесь .

0 голосов
/ 20 июля 2016

COM Interop - это технология, включенная в .NET Framework Common Language Runtime (CLR), которая позволяет объектам объектной модели компонентов (COM) взаимодействовать с объектами .NET и наоборот.COM Interop стремится обеспечить доступ к существующим компонентам COM, не требуя изменения исходного компонента, и наоборот.Больше на: http://www.writeulearn.com/com-interop-using-csharp/

...