繁体   English   中英

通过COM Interop公开C#类

[英]Expose C# class through COM Interop

我有一个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)为假? 我的理解是我只会在接口中具有要公开的功能,因此无论可见属性如何,如果我在接口中没有该功能,那么它将不可见? 我确实了解了如何通过复制dll并使用regasm.exe在客户端计算机中使用regasm进行部署,我的问题是如何在未安装.NET的非开发计算机中进行部署?

 [ClassInterface(ClassInterfaceType.None)]

这意味着没有任何类实现细节是可见的,即正确的纯COM方法。 因此, 没有必要申请[标记有ComVisible特性(假)上的方法,你不希望暴露。 Iinterface方法可见。

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

目标计算机必须已安装.NET,严格要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM