Экспорт метода псевдоним COM видимого класса .NET - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть конструкция реализации .NET некоторой утилиты и сценарий .WSC, который создает экземпляр объекта .NET.Цель состоит в том, чтобы исключить сценарий WSC, а также создать экземпляр и вызвать реализацию .NET напрямую.Но это обнаружило проблему именования.

Класс, определенный в WSC, содержит несколько методов.Одним из таких методов является Finalize().Имя функции зарезервировано в .NET, так как оно используется для управления временем жизни и GC.Поэтому WSC вызывает функцию .NET с другим именем:

<?xml version="1.0"?>
<component>
  <public>
    <method name="Finalize"/>
  </public>
  <object id="wrapper" progid="JS.Wrapper"/>

  <script language="JScript">
    <![CDATA[
      // Processes last required steps and closes all logs
      function Finalize() {
         return wrapper.Finish();
      }
      // Any other function
      function Foo() {
        wrapper.Foo();
      }
    ]]>
  </script>
</component>

. Класс .NET реализует функцию Finish:

[ComVisible(true)]
[ProgId("JS.Wrapper")]
public class MyCom
{
    // Processes last required steps and closes all logs
    public void Finish()
    {
    }

    public void Foo()
    {
    }
}

Существуют тысячи сценариев, которыевызвать все функции Foo () и Bar ().И большинство из них также вызывает функцию Finalize.Поэтому невозможно изменить имя функции на интерфейсе COM.

  • Как сделать функцию Finish доступной для COM-видимости с именем Finalize?
  • Есть ли способреализовать две функции Finalize, одну для среды выполнения .NET и одну, экспортируемую через интерфейс COM.
  • Можно ли реализовать интерфейс COM явно, т.е. создать пользовательскую реализацию интерфейса COM?

Существует атрибут ComAliasName , который можно использовать для отображения свойства, индексатора, поля, параметра или возврата с псевдонимом.Но его нельзя использовать для имени метода.Как метод сделать видимым как псевдоним?

1 Ответ

0 голосов
/ 05 апреля 2019

Метод Finalize может быть представлен путем явного определения интерфейса COM.

public interface IMyCom
{
    // Processes last required steps and closes all logs
    void Finalize();
    void Foo();
}

Важно выбрать ClassInterfaceType.None в реализующем классе .NET. Реализация в классе .NET должна указывать реализуемый интерфейс. С префиксом области действия IMyCom компилятор может различать имя метода в интерфейсе COM и некоторые внутренние имена .NET CLR. Это делает ненужным использование другого имени метода и создание псевдонима.

[ComVisible(true)]
[ProgId("JS.Wrapper")]
[ClassInterface(ClassInterfaceType.None)]
public class MyCom : IMyCom
{
    // Explicitly specify the scope of the Finalize method.
    void IMyCom.Finalize()
    {
    }

    void IMyCom.Foo()
    {
    }
}

Этот подход также проясняет, что это реализация метода интерфейса COM.

...