【问题标题】:Expose C# class through COM Interop通过 COM 互操作公开 C# 类
【发布时间】:2015-06-29 06:31:33
【问题描述】:

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

【问题讨论】:

  • 我不认为你可以部署到没有 .NET 的机器上。即使暴露给 COM,它仍然是一个 .NET 程序集,并且需要安装框架,以便运行时可以加载和执行程序集。
  • 也许这个操作意味着没有安装 Visual Studio 或 Windows SDK。

标签: c# .net dll com


【解决方案1】:
 [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。这是最好的方法吗?
  • 使用 Regasm 并不是一个“最好的方法”,COM 服务器应该有一个安装程序,所以部署起来非常简单。很容易用this VS add-on创建一个。
猜你喜欢
  • 2012-07-19
  • 1970-01-01
  • 2015-03-21
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 2012-02-27
相关资源
最近更新 更多