通过 COM Interop 公开 C# class
Expose C# class through COM Interop
我有一个 C# class 库,还有一个 powerbuilder 应用程序。我想公开 c# class 并在 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 中访问,但我仍然有一些基本问题来确保我是否遵循了最佳指南。 class 在转换为 COM 之前看起来像
class classname
{
function1(){//do something}
function2(){//do something}
function3(){//do something}
function4(){//do something}
}
为了转换为 COM,我创建了一个接口,我只想公开 function1 和 function2。所以我将 class 修改为
[ComVisible(true)]
[Guid("03S3233DS-EBS2-5574-825F-EERSDG8999"),InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface Iinterface
{
function1();
function2();
}
主要class我做了以下修改
1. 我在 AssemblyInfo 中将 COM visible 属性 设置为 false,因为我不想公开所有 public 方法。
2. Class看起来像
[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 的可见 属性 设置为 true 并且默认 COM 可见 属性(在 assemblyinfo 中)为假?我的理解是我只会有我想在界面中公开的功能,所以不管可见的 属性,如果我没有界面中的功能那么它就不会可见吗?我确实了解如何通过复制 dll 并使用 regasm.exe 在客户端计算机中使用 regasm 进行部署,我的问题是如何在未安装 .NET 的非开发计算机中进行部署?
[ClassInterface(ClassInterfaceType.None)]
这意味着 class 实现细节中的 none 是可见的,正确且纯 COM 方式。因此,不需要 对您不想公开的方法应用 [ComVisible(false)]。只有 Iinterface
方法可见。
使用,比方说,ClassInterfaceType.AutoDual 在.NET 中很方便,CLR 会自动合成一个接口。它与旧版本的 Visual Basic (VBA, VB6) 的行为相匹配,它们还不支持接口。然而,它确实暴露了太多,从 System.Object 继承的方法(如 GetHashCode 等)也将是可见的,而没有合适的方法来隐藏它们。您还获得了对 mscorlib.tlb 类型库的依赖。因此,像您一样显式声明接口当然是更好的方法。
目标机器必须安装了.NET,要求非常严格。
我有一个 C# class 库,还有一个 powerbuilder 应用程序。我想公开 c# class 并在 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 中访问,但我仍然有一些基本问题来确保我是否遵循了最佳指南。 class 在转换为 COM 之前看起来像
class classname
{
function1(){//do something}
function2(){//do something}
function3(){//do something}
function4(){//do something}
}
为了转换为 COM,我创建了一个接口,我只想公开 function1 和 function2。所以我将 class 修改为
[ComVisible(true)]
[Guid("03S3233DS-EBS2-5574-825F-EERSDG8999"),InterfaceType(ComInterfaceType.InterfaceIsDual)]
interface Iinterface
{
function1();
function2();
}
主要class我做了以下修改 1. 我在 AssemblyInfo 中将 COM visible 属性 设置为 false,因为我不想公开所有 public 方法。 2. Class看起来像
[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 的可见 属性 设置为 true 并且默认 COM 可见 属性(在 assemblyinfo 中)为假?我的理解是我只会有我想在界面中公开的功能,所以不管可见的 属性,如果我没有界面中的功能那么它就不会可见吗?我确实了解如何通过复制 dll 并使用 regasm.exe 在客户端计算机中使用 regasm 进行部署,我的问题是如何在未安装 .NET 的非开发计算机中进行部署?
[ClassInterface(ClassInterfaceType.None)]
这意味着 class 实现细节中的 none 是可见的,正确且纯 COM 方式。因此,不需要 对您不想公开的方法应用 [ComVisible(false)]。只有 Iinterface
方法可见。
使用,比方说,ClassInterfaceType.AutoDual 在.NET 中很方便,CLR 会自动合成一个接口。它与旧版本的 Visual Basic (VBA, VB6) 的行为相匹配,它们还不支持接口。然而,它确实暴露了太多,从 System.Object 继承的方法(如 GetHashCode 等)也将是可见的,而没有合适的方法来隐藏它们。您还获得了对 mscorlib.tlb 类型库的依赖。因此,像您一样显式声明接口当然是更好的方法。
目标机器必须安装了.NET,要求非常严格。