通过COM互操作公开C#类



我有一个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,我创建了一个接口,只想公开函数1和函数2。所以我把类修改为

[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?我的理解是,我只会有我想在接口中公开的函数,所以不管可见属性如何,如果我在接口中没有函数,那么它就不可见了?我确实了解如何通过复制dll和使用regasm.exe在客户端计算机中使用regasm进行部署,我的问题是如何在没有的非开发机器中进行部署。NET安装了吗?

[ClassInterface(ClassInterfaceType.None)]

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

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

目标机器必须具有。NET安装,要求坚如磐石。

相关内容

  • 没有找到相关文章

最新更新