Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将c#类公开为com对象接口?_C#_C++_Com - Fatal编程技术网

如何将c#类公开为com对象接口?

如何将c#类公开为com对象接口?,c#,c++,com,C#,C++,Com,我有一个c级P2PLib public int portRecv=10101; public int portSend = 10102; public int multicastPort=10103; int memberNum = 0; string data; string time; List<Member> MemberList = new List<Member>(); public void Displ

我有一个c级P2PLib

 public int portRecv=10101;
    public int portSend = 10102;
    public int multicastPort=10103;
    int memberNum = 0;
    string data;
    string time;
    List<Member> MemberList = new List<Member>();
    public void DisplayMembers();
    public void start(...);
    public void join(..);
    public void leave(..);
    void add(...);
    void remove(...);
public int-portRecv=10101;
公共int端口发送=10102;
公共int多播端口=10103;
int memberNum=0;
字符串数据;
串时间;
列表成员列表=新列表();
公共成员();
公共无效启动(…);
公共无效连接(……);
公众假期(……);
无效添加(…);
无效删除(…);
<如何在C++与C++之间的互通信中创建这个类的服务器端代码?< /p> 这个例子展示了我们如何编写可以是一组方法的接口

<>但是我很困惑,我的变量,比如PoPoStand等,将如何在C++客户端代码中启动。
---编辑---我可以用com接口保存持久数据吗?例如,上述清单?我能否在与托管代码com对象通信的非托管代码中创建此类的对象?

您不能在com接口中公开字段,只支持属性和方法。在C#编程中,这通常是一种很好且被广泛采用的做法,在这方面也有帮助:

public class PortWrapper {
   public int ReceivePort {
      get { return portRecv; }
      set { 
         if (value == portRecv) return;
         if (value < 256 || value > 65535) throw new ArgumentOutOfRangeException();
         portRecv = value;
         setupReceiver();
      }
   }
   // etc..

   private int portRecv=10101;
}
公共类端口包装器{
公共int接收端口{
获取{return portRecv;}
集合{
if(value==portRecv)返回;
如果(值<256 | |值>65535)抛出新ArgumentOutOfRangeException();
portRecv=值;
设置接收器();
}
}
//等等。。
私有int端口RECV=10101;
}

在C#代码中实际声明一个接口,就可以进入这个成功的陷阱。这是一个全面的好主意,因为它允许您使用[ClassInterface(ClassInterfaceType.None)]隐藏实现类的详细信息,并使用[InterfaceType(ComInterfaceType.InterfaceAisDual)]公开纯接口。这是自然的COM方式。

在纯C代码中,当我创建类P2PLib的对象时,该对象在内部保存一些数据,如客户端列表。当我只从我的C语言对象到我的未来C++代码时,我不能使用像我的C代码那样的持久数据吗?当然可以,它仍然是一个类对象。COM支持coclass,它甚至没有静态数据的概念。C++代码将必须使用属性获取方法来获取值,比如“代码> Obj-> GETYRealEvestPoT(和端口)< /C>。其他支持属性的语言将使您的属性看起来像一个字段,就像C#一样。