导出 COM 可见 .NET 的方法别名 class
Export a method alias of COM visible .NET class
我有一些实用程序的 .NET 实现结构和实例化 .NET 对象的 .WSC
脚本。目标是消除 WSC
脚本并直接实例化和调用 .NET 实现。但是这发现了一个命名问题。
WSC 中定义的class 包含几种方法。其中一种方法是 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 class 实现了 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 可用于使 属性、索引器、字段、参数或 return 通过别名可见。但它不能用于方法名。 方法如何作为别名可见?
方法 Finalize
可以通过显式定义 COM 接口来公开。
public interface IMyCom
{
// Processes last required steps and closes all logs
void Finalize();
void Foo();
}
在实现.NETclass中选择ClassInterfaceType.None
很重要。
.NET class 中的实现应指定实现的接口。使用范围前缀 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接口方法的实现。
我有一些实用程序的 .NET 实现结构和实例化 .NET 对象的 .WSC
脚本。目标是消除 WSC
脚本并直接实例化和调用 .NET 实现。但是这发现了一个命名问题。
WSC 中定义的class 包含几种方法。其中一种方法是 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 class 实现了 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 可用于使 属性、索引器、字段、参数或 return 通过别名可见。但它不能用于方法名。 方法如何作为别名可见?
方法 Finalize
可以通过显式定义 COM 接口来公开。
public interface IMyCom
{
// Processes last required steps and closes all logs
void Finalize();
void Foo();
}
在实现.NETclass中选择ClassInterfaceType.None
很重要。
.NET class 中的实现应指定实现的接口。使用范围前缀 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接口方法的实现。