COM与.NET交互简单示例--追忆VB6

导读:本文以VB6为例,主要介绍.NET引用COM和COM引用.NET的两个简单示例。

<1>.NET调用COM

为了简单,我们使用VB6,这个据说即将开源的老古董,来制作一个简单的COM。

在VB6中新建一个ActiveX dll工程,只有一个类ComCalc.cls,代码如下:

邀月工作室

注意;设置兼容性,并生成dll

邀月工作室

然后 ,vs2010中新建一Console项目,微软很奇怪,VB6中的project叫工程,自vs2002起又改名叫“项目”。添加对刚才创建的COM的引用

邀月工作室

邀月工作室

运行效果:

邀月工作室

也许很多人会对这段c#代码很好奇,这个_ComCalc是什么时候产生的?为什么通过它来调用方法,而不是通过类对象?

我们首先看一下,刚才引用COM后,VS IDE为我们做了什么。

邀月工作室

请注意,上图中,Interop.SimpleComServer.dll是IDE为我们生成的一个叫“互操作程序集”的东东,而这个东东正是COM和.NET中间的桥梁。

通过对象视图,我们看到_ComCalc正是在这个dll中生成的。我们可以通过OLEView.exe来察看这个Interop.SimpleComServer.dll的Typelib。

如果你已经装全了VB6,你可以在VB目录中找到OLEView.exe,并运行它。如果你没有装全,你可以运行vs2010自带的OLEView.exe,位于

E:/Program Files/Microsoft SDKs/Windows/v7.0A/bin下

邀月工作室

邀月工作室

找到SimpleComServer,并双击

邀月工作室

依据COM规则:COM客户端与COM类进行交互的唯一方式是使用接口引用,而不是对象引用。

如果创建了基于C++的COM客户端,需要特别关注对特定接口的查询过程,如果接口不再被使用,一定要释放它。

如果是VB6创建的客户端,会自动拥有一个默认接口。

现在回到C#代码中来,

  
  

<2>COM调用.NET

记住,COM客户端与COM类进行交互的唯一方式是使用接口引用,而不是对象引用。而.NET不需要任何接口。 此时,我们必须确保每个公共成员公开成默认的接口。

我们需要设置[ClassInterface]特性,其属性值可以为以下三个枚举值之一:

AutoDual: 指示自动为类生成双重类接口并向 COM 公开。 为该类接口生成类型信息并在类型库中发布。 由于 ClassInterfaceAttribute 中描述的版本控制方面的限制,极力建议不要使用 AutoDual。

AutoDispatch : 指示该类只支持 COM 客户端的后期绑定。 在请求时,该类的 dispinterface 将自动向 COM 客户端公开。 Tlbexp.exe(类型库导出程序) 生成的类型库不包含 dispinterface 的类型信息,以防止客户端缓存接口的 DISPID。 由于客户端只能后期绑定到接口,因此 dispinterface 不会出现 ClassInterfaceAttribute 中所述的版本控制问题。
这是 ClassInterfaceAttribute 的默认设置。

None :指示不为类生成类接口。 如果未显式实现任何接口,则该类将只能通过 IDispatch 接口提供后期绑定访问。 这是 ClassInterfaceAttribute 的推荐设置。 要通过由类显式实现的接口来公开功能,唯一的方法是使用 ClassInterfaceType.None

详见MSDN:http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.classinterfacetype.aspx

新建一vs2010项目。

邀月工作室

注意:作为最佳实践,应该将.NET程序部署到GAC。此时,需要一个SNK文件以供签名。如不部署到GAC,则需要复制到与COM应用程序相同的路径下。

我们选择GAC部署

邀月工作室

邀月工作室

部署成功!

下来我们需要生成必要的COM类库。可以使用tlbexp.exe命令,当然,通过UI界面,也可以。

邀月工作室

现在我们再用OLEView.exe来查看

邀月工作室

新建一Vb标准exe工程,并添加引用

邀月工作室

邀月工作室

邀月工作室


邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 
3w@live.cn  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VB.Net中的DataGridView控件是一种非常常用的数据显示和编辑控件。它允许以表格形式显示数据,并提供了丰富的功能,如排序、筛选、分页等。 以下是一个简单VB.Net中使用DataGridView控件的示例: 首先,您需要在窗体上添加一个DataGridView控件。在窗体设计器中,拖拽并放置一个DataGridView控件。 然后,在窗体的Load事件中,设置DataGridView的数据源。比如,从数据库中读取数据,可以使用ADO.Net的相关类进行处理。 ```vb.net Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 创建一个DataTable对象,并定义字段 Dim dt As New DataTable() dt.Columns.Add("ID", GetType(Integer)) dt.Columns.Add("名称", GetType(String)) ' 添加示例数据 dt.Rows.Add(1, "数据1") dt.Rows.Add(2, "数据2") dt.Rows.Add(3, "数据3") ' 将DataTable设置为DataGridView的数据源 DataGridView1.DataSource = dt End Sub ``` 接下来,您可以在窗体上自定义DataGridView的外观和行为。比如,设置列宽、列标题、是否允许用户进行编辑等。 ```vb.net Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 设置列标题 DataGridView1.Columns("ID").HeaderText = "ID" DataGridView1.Columns("名称").HeaderText = "名称" ' 设置列宽 DataGridView1.Columns("ID").Width = 50 DataGridView1.Columns("名称").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill ' 设置是否允许用户编辑 DataGridView1.ReadOnly = False End Sub ``` 最后,您还可以使用DataGridView提供的事件进行数据的处理和交互。比如,处理用户点击表头排序的事件,处理选中行的事件等。 ```vb.net Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick ' 根据点击的列进行排序 DataGridView1.Sort(DataGridView1.Columns(e.ColumnIndex), System.ComponentModel.ListSortDirection.Ascending) End Sub Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged ' 获取选中的行数据 Dim selectedRow As DataGridViewRow = DataGridView1.CurrentRow If selectedRow IsNot Nothing Then Dim id As Integer = CInt(selectedRow.Cells("ID").Value) Dim name As String = CStr(selectedRow.Cells("名称").Value) ' 处理选中行的数据 '... End If End Sub ``` 综上所述,以上是一个示例,展示了如何在VB.Net中使用DataGridView控件,并对其进行一些基本的设置和处理。您可以根据自己的需求,进一步定制和扩展DataGridView的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值