COM Interop中的.NET属性?

问题描述:

是不是真的不能使用COM Interop来公开COM属性?一切都必须是一种方法?COM Interop中的.NET属性?

如果这不是真的,你是如何做到的?

不正确。

我理解你的问题是询问COM calling or using a .NET class

根据this page,您可以将托管类的方法,属性和字段公开给COM使用者。

要暴露给COM的所有托管类型,方法,属性,字段和事件都必须是公共的。类型必须有一个公共的默认构造函数,它是唯一可以通过COM调用的构造函数。

这是否对你的工作?:

[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
[Guid("A1209192-723B-4325-8599-FB39D9F202D9")] 
public interface ITicklee 
{ 
    [DispId(1)] 
    void TickleMe(); 

    [DispId(2)] 
    int Count{get;} 
} 


[Guid("45715A3B-CA95-49f7-9889-A0022B31EF8A")] 
public class Elmo : ITicklee 
{ 
    // default ctor 
    public Elmo() {} 

    private int _tickleCount; 

    public int Count 
    { 
     get 
     { 
      return _tickleCount; 
     } 
    } 

    public void TickleMe() 
    { 
     _tickleCount++; 
    } 
} 

一个VBScript测试客户端可能是这样的:

Sub TestTickle() 

    WScript.echo("") 

    WScript.echo("Instantiating an Elmo ...") 
    dim elmo 
    set elmo = WScript.CreateObject("Ionic.Tests.Com.Elmo") 

    WScript.echo("Tickling...") 

    For i = 1 to 5 
     elmo.TickleMe() 
    Next 

    WScript.echo("") 
    c = elmo.Count 

    WScript.echo("Tickle Count = " & c) 

    ' one for the road' 
    elmo.TickleMe() 

End Sub 

call TestTickle()  ' ahem ' 

如果你的意思是你不能公开的COM对象属性为.NET应用程序使用interop,并且COM对象是在VB中创建的,那么你是正确的。 VB使用属性LET作为本机类型,使用属性SET作为对象类型。如果您尝试从.NET应用程序设置COM对象的属性,它会尝试使用SET。如果底层属性是本机VB类型,则失败。

据我所知,除了使用方法而不是属性之外,唯一的解决方案是手动操作IDL。

点评:据我所知,你可以使用只读属性只有

+0

虽然这很烦人,当你不能因低信誉发表评论,请避免回答的问题与意见。 http://*.com/help/whats-reputation可以提供一些关于声誉获得(和损失)的信息 – chrisb2244 2014-09-27 15:24:49