首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

[com interop.]VB调用vb.net编写的DLL,部署有关问题

2012-01-11 
[com interop.]VB调用vb.net编写的DLL,部署问题我在XP下使用vs2005新建了一个vb--类库,添加com类vb.net st

[com interop.]VB调用vb.net编写的DLL,部署问题
我在XP下使用vs2005新建了一个vb--类库,添加com类
vb.net steps:
(1)VB.NET-->类库-->类-->确定
(2)删除class1
(3)添加新项-->COM 类 命名为ComClsDataComm.vb

代码如下:

VB.NET code
 
Option Explicit On

<ComClass(ComClsDataComm.ClassId, ComClsDataComm.InterfaceId, ComClsDataComm.EventsId)> _
Public Class ComClsDataComm
#Region "COM GUID"
    ' 这些 GUID 提供此类的 COM 标识
    ' 及其 COM 接口。若更改它们,则现有的
    ' 客户端将不再能访问此类。
    Public Const ClassId As String = "8b99d51c-e932-49a1-a4cc-f8e81fe5e0ff"
    Public Const InterfaceId As String = "3a8c331a-fe8f-4ebb-a47c-a5fe85b471ca"
    Public Const EventsId As String = "fbb2cc74-26bf-4814-929f-509ff489ca19"
#End Region

    ' 可创建的 COM 类必须具有一个不带参数的 Public Sub New()
    ' 否则, 将不会在
    ' COM 注册表中注册此类,且无法通过
    ' CreateObject 创建此类。
    Public Sub New()
        MyBase.New()
        MsgBox("new - 1")
        If frmData Is Nothing Then
            MsgBox("new - 2")
            frmData = New FrmDataComm
        End If
        MsgBox("new - 3")
        frmData.Activate()
    End Sub

    Protected Overrides Sub Finalize()
        If Not frmData Is Nothing Then
            frmData.Dispose()
            frmData = Nothing
        End If
        Me.Finalize()
    End Sub

    Public Function dll_DataSend(ByVal intKind As Short, ByVal strData As String _
                            , ByRef intRet As Short _
                            , Optional ByVal blnKind As Boolean = True _
                            , Optional ByVal blnFormModal As Boolean = False) As Boolean
        On Error GoTo ERR_Exit

        dll_DataSend = False

        MsgBox("1")
        If frmData.DataSend(intKind, strData, intRet, blnKind, blnFormModal) Then
            dll_DataSend = True
        End If
        MsgBox("2")
        Exit Function

ERR_Exit:
        MsgBox("error exit")
        dll_DataSend = False
        intRet = enumProcRslt.RSLT_ERR
        Err.Clear()
    End Function

    Public Sub hello()
        MsgBox("hello")
    End Sub
End Class

同时保证了:1. 程序集里面的comvisible为true
2. 勾上了“为com interop注册”
然后我将编译好的SLDataComm.dll && SLDataComm.tlb一并发给了本地的虚拟机(win2000 + vb6 +新装的.net framework2.0)

虚拟机环境下:
1. 在 “工程 --- 引用 ---- 浏览”之后,添加了我的tlb文件,保存当前的工程设定等修改,关闭vb6(1,2可以互换应该, 我没试过,主要是不想用vs2005导出的tlb~)
2. regasm SLDataComm.dll /tlb /codebase (这个会覆盖掉原来的tlb,生成新的tlb文件,不加codebase选项,vb中直接debug会出错,不知道为什么)
3. 重新打开vb6.0


VB code
Dim DataComm as ComClsDataCommSet DataComm = New ComClsDataCommDataComm.hello

在VB中直接调试,一切正常!

之后我将生成的exe文件直接拷贝到目标机器上,系统环境为xp+同样版本的。net framework 2.0
注册dll:regasm SLDataComm.dll,并且将该dll引用的一些类库*。dll一并拷入到目标机器的安装目录c:\XX\
运行之后,会有
automation error (-2146232576)

搜索了一圈,相关的帖子还真不少,但是我也不知道怎么回事,都试过了,还是老样子

Any suggestion?
Thx a lot!

[解决办法]
去.net问问,那边很多是VB转过去的
[解决办法]
我也有vb6调用.neet的interop com 但是没有没遇到过你这样的情况哦

你确定是这个.net的dll产生的错误么,可以做一个试验,把这部分拿掉看看是不是别的什么dll产生的错误。你的其他引用的dll是否注册了?

另外单作一个vb6工程,只有这一个引用。多加msgbox

你注册后到注册表里面看看是否成功注册

最不济可以用工具查所有的dependent files然后全部可以打包做一个installer到目标机看看

热点排行