通过COM互操作公开C#类

3
我有一个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可见属性设置为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. 如果我将类的可见性属性设置为true,并将默认的COM可见性属性(在assemblyinfo中)设置为false,那么对于我不想公开的方法,我是否需要明确地将COM可见性属性设置为false?我的理解是,我只会在接口中暴露我想要公开的函数,因此无论可见性属性如何,如果我不在接口中拥有该函数,则它将不可见?我已经了解如何使用regasm在客户端计算机上部署,只需复制dll并使用regasm.exe,我的问题是如何在未安装.NET的非开发计算机上部署?


1
我认为你无法在没有.NET的机器上部署。即使暴露给COM,它仍然是一个.NET程序集,并且需要安装框架以便运行时可以加载和执行程序集。 - Ron Beyer
也许OP的意思是没有安装Visual Studio或Windows SDK。 - acelent
1个回答

6
 [ClassInterface(ClassInterfaceType.None)]

这意味着类的所有实现细节都不可见,这是正确和纯净的COM方式。因此,不需要在不想公开的方法上应用[ComVisible(false)]。只有Iinterface方法是可见的。
使用ClassInterfaceType.AutoDual是.NET中的一种便利方式,CLR会自动生成接口。它匹配旧版本的Visual Basic(VBA、VB6)的行为,它们尚不支持接口。但它暴露了太多东西,从System.Object(如GetHashCode等)继承的方法也将可见,而没有很好的隐藏方法。您还将获得对mscorlib.tlb类型库的依赖项。因此,像您所做的那样明确声明接口肯定是更好的方式。
目标机器必须安装.NET,这是一个非常严格的要求。

谢谢,这解答了我的问题。那么将dll部署到客户端机器的最佳方法是什么?我读到其中一种方法是将dll复制到其他机器上,然后使用regasm.exe并指向dll以在客户端机器上注册dll。这是最好的方法吗? - Pete sam
使用Regasm肯定不是"最佳方式",COM服务器应该有一个安装程序,这样部署就非常简单了。可以使用此VS插件轻松创建一个。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接