-1

我有一些实用程序的 .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-Visible Finalize
  • 有没有办法实现两个 Finalize 函数,一个用于 .NET 运行时,一个在 COM 接口处导出。
  • 是否可以显式实现 COM 接口,即自定义实现 COM 接口?

有一个属性ComAliasName可用于使属性、索引器、字段、参数或通过别名返回可见。但它不能用于方法名称。如何使方法作为别名可见?

4

1 回答 1

0

该方法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 接口方法的实现。

于 2019-04-05T13:57:38.987 回答