导出COM可见.NET类的方法别名

时间:2019-04-04 11:55:35

标签: .net com comvisible

我有一些实用程序的.NET实现的构造,还有一个实例化.NET对象的.WSC脚本。目的是消除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界面上更改功能名称。

  • 如何使名称为Finalize的Finish函数变成COM可见的?
  • 有没有一种方法可以实现两个Finalize函数,一个用于.NET运行时,另一个在COM接口导出。
  • 是否可以显式实现COM接口,即对COM接口进行自定义实现?

有一个属性ComAliasName,可用于使属性,索引器,字段,参数或使用别名返回的属性可见。但是它不能用于方法名称。 方法如何显示为别名?

1 个答案:

答案 0 :(得分:0)

可以通过显式定义COM接口来公开方法Finalize

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

在实现.NET类中选择ClassInterfaceType.None很重要。 .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接口方法的实现。