COM-интерфейс / класс возвращает ошибку «объект не имеет свойств или методов» - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь разработать механизм вычислений и выставить реализованные классы как COM-объекты, следующие за Article . Открытая DLL (Com Object) будет использоваться сторонним приложением. Некоторые старые библиотеки DLL, реализованные в VB6, теперь используются и работают должным образом.

Пока конечная библиотека DLL регистрируется с помощью команды RegAsm в командной строке, объект COM становится видимым в целевом приложении, но я получаю сообщения об ошибках

"Не удалось создать объект", "У объекта нет свойств или методов".

То, что я пробовал до сих пор, в дополнение к приведенному ниже коду, перечислены ниже:

  • ComVisible установлен на true in AssemblyIfo.cs
  • Проверено «Зарегистрироваться для взаимодействия COM» в параметрах сборки
  • Установить [ComVisible (true)] атрибут classe / interface и / или метода
  • Установить Атрибут [DispId (0)] в классе / интерфейсе и / или методе с различными значениями !!
  • Установить атрибут [ProgId] в классе / интерфейсе и / или методе
  • Все методы и классы определены как publi c members
  • Пробовал все Вышеуказанные действия с классом с / без интерфейса
  • Попробовали все вышеперечисленные действия с классом с / без интерфейса события

Я создал пример кода в качестве примера здесь, любой приветствуется дальнейшая помощь:)

using System;
using System.Runtime.InteropServices;

namespace project_name
{
    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
    [ComVisible(true)]
    public interface ComClass1Interface
    {
        [DispId(0)]
        [ComVisible(true)]
        double calc();
    }

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

    [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
        ClassInterface(ClassInterfaceType.None),
        ComSourceInterfaces(typeof(ComClass1Events))]
    public class ComClass1 : ComClass1Interface
    {
        public double calc()
        {
            return 13;
        }
    }
}

DLL регистрируется с помощью команды RegAsm для включения в COM-объекты. DLL registration using RegASM

Объект Com становится видимым для целевого приложения.

The object is now visible as COM Objects

При попытке выбора В реализованном методе я сталкиваюсь с этими ошибками: - /:

enter image description here

Я использую Visual Studio 2019, C#,. NET Framework 4.0 и целевое приложение работает на Windows Server 2008 R2 и установлены *. 1077 * Frameworks 3.5, 4.6.

1 Ответ

2 голосов
/ 09 апреля 2020

Проблема, решаемая с помощью следующих действий:

  1. Сборка должна быть подписана строгим именем (я использовал средство подписи Visual Studio)
  2. COM-объект должен быть зарегистрирован с помощью regasm path/dll-name.dll /codebase /tlb /nologo
...