我有一些实用程序的.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可见的?有一个属性ComAliasName,可用于使属性,索引器,字段,参数或使用别名返回的属性可见。但是它不能用于方法名称。 方法如何显示为别名?
答案 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接口方法的实现。