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



我有一个实用程序的.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 接口上更改函数名称。

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

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

可以通过显式定义 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 接口方法的实现。

相关内容

  • 没有找到相关文章

最新更新