c# - 通过 COM Interop 公开 C# 类

标签 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,我创建了一个接口(interface),我只想公开 function1 和 function2。所以我将类修改为

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

在主类中我做了以下修改 1. 我在 AssemblyInfo 中将 COM 可见属性设置为 false,因为我不想公开所有公共(public)方法。 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 将自动合成一个接口(interface)。它与旧版本的 Visual Basic(VBA、VB6)的行为相匹配,它们还不支持接口(interface)。然而,它确实暴露了太多,从 System.Object 继承的方法(如 GetHashCode 等)也将是可见的,而没有合适的方法来隐藏它们。您还依赖于 mscorlib.tlb 类型库。因此,像您那样显式声明接口(interface)当然是更好的方法。

目标机器必须安装了 .NET,这是非常严格的要求。

关于c# - 通过 COM Interop 公开 C# 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783350/

相关文章:

c# - Entity Framework : ObjectContext. ExecuteStoreQuery 产生分离的对象

c - 有没有办法通过名称获取 Windows 中当前进程的函数?

c# - 可见性取决于通用数据类型

c# - 检查当前是否没有用户登录到 Windows

c# - 表值函数和 Entity Framework

.net - System.StackOverflowException 发生与链接到 Html

.net - 使用什么 UI 技术?

dll - 在 Firefox 扩展中使用 Firebreath 生成的插件?

c++ - 在哪里存储 .properties 文件以在 C++ dll 中使用

c# - WCF REST 服务 : passing country code