通过COM Interop公开C#类

时间:2015-04-21 21:21:18

标签: c# .net dll com

我有一个C#类库,还有一个powerbuilder应用程序。我想公开c#类并在powerbuilder应用程序中使用它。我使用以下博客来公开这些功能,以便powerbuilder应用程序可以访问它们 https://whoisburiedhere.wordpress.com/2011/07/12/creating-a-com-object-from-scratch-with-c/ http://jumbloid.blogspot.com/2009/12/making-net-dll-com-visible.html

所以我暴露了COM并使其在powerbuilder中可访问但我仍然有一些基本问题以确保我是否遵循最佳指南。转换为COM之前的类看起来像

 class classname
 {
    function1(){//do something}
    function2(){//do something}
    function3(){//do something}
    function4(){//do something}
 }  

要转换为COM我创建了一个接口,我想只公开function1和function2。所以我将课程修改为

[ComVisible(true)]
[Guid("03S3233DS-EBS2-5574-825F-EERSDG8999"),InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface Iinterface
{
  function1();
  function2();
}

在主课程中,我做了以下修改 1.我在AssemblyInfo中将COM visible属性设置为false,因为我不想公开所有公共方法。 2.班级看起来像

[ComVisible(true)]
[Guid("2FD1574DS4-3FEA-455e-EW60A-EC1DFS54542D"), ClassInterface(ClassInterfaceType.None)]
class class1 : Iinterface
{
    function1(){//do something}
    function2(){//do something}
    [ComVisible(false)] //i don't want the mehtod to be exposed
    function3(){//do something}
    [ComVisible(false)]
    function4(){//do something}
}

我有以下问题让我更好地理解 1.如果我将class的visible属性设置为true并且将默认的COM visible属性(在assemblyinfo中)设置为false,那么我是否可以为我不想公开的方法显式设置COM visible属性为false?我的理解是我只有我想要在界面中公开的函数,所以无论可见属性如何,如果我在界面中没有该函数那么它将不可见?我确实了解如何通过复制dll并使用regasm.exe在客户端计算机中使用regasm进行部署,我的问题是如何在没有安装.NET的非开发机器中部署?

1 个答案:

答案 0 :(得分:3)

 [ClassInterface(ClassInterfaceType.None)]

这意味着没有任何类实现细节可见,正确且纯粹的COM方式。因此,对于您不想公开的方法,应用[ComVisible(false)] 是必要的。只有Iinterface方法可见。

使用ClassInterfaceType.AutoDual是一种方便的.NET,CLR会自动合成一个接口。它匹配旧版本的Visual Basic(VBA,VB6)的行为,它们还不支持接口。然而它确实暴露了太多,从System.Object继承的方法(如GetHashCode等)也是可见的,没有合适的方法来隐藏它们。您获得了对mscorlib.tlb类型库的依赖。因此,明确地像你那样声明界面肯定是更好的方法。

目标计算机必须安装了.NET,这是一项艰巨的要求。