none
有關於VB.net 開發DLL的問題 RRS feed

  • 問題

  • 各位大大 小弟 最近在想要 開發一些DLL 來使用

    因為 程式的一些FUNCTION 太多 而且一直在重複

    所以就想將這些 FUNCTION SUB 包起來 到時候就直接CALL就可以

    可以我將這些 FUNCTION 包起來 封裝成DLL

    我去CALL這些DLL的時候

    卻出現

    DLL 進入點 XXXX(FUNCTION) 無法在  XXX.DLL 中找到

     

    小弟這裡 有幾點小小的問題想要請教

    1.不知道哪裡有開發DLL類別庫的範例(只要簡單的就可以了 我的FUNCTION都是一些簡單的計算 但是要回傳值)

    2.小地想要學開發DLL 各位大大有沒有推薦的好書。

    3.各位大大可以簡單跟我說明一下,我將這些已使用很久的FUNCTION 挪到 類別庫中去使用

       有哪些注意的事項

    4.最後來有一個 問題就是 像是MSCOMM / WINSOCK 有辦法在類別庫中使用??

      (我有一些通訊的 函式 也是一直在重複)

    麻煩各位大大了^^

     

    2008年5月5日 上午 01:33

解答

  • 你引用的方法錯誤。

    VB.NET 產出的是 .NET DLL,只要加入該類別庫的參考即可使用。

    而你用的是呼叫 Win32 這種純 DLL 的方法,當然無法成功。

     

    1.不知道哪裡有開發DLL類別庫的範例(只要簡單的就可以了 我的FUNCTION都是一些簡單的計算 但是要回傳值)

     

    你只要知道基本的類別結構,要寫類別庫基本上不需要範例 ...

     

    2.小地想要學開發DLL 各位大大有沒有推薦的好書。

     

    這和 1 一樣,但如果你要學習元件開發,就有幾本書可以參考,建議你去天瓏走一趟自己看內容,看的下再買:

     

    Code Snippet

    1. ASP.NET 元件設計(碁峰,黃忠成著)

    2. MCTS Training Kit for 70-526 (MS Press)

    3. OOP for VB.NET and C# (MS Press, 有中文書)

     

     

    3.各位大大可以簡單跟我說明一下,我將這些已使用很久的FUNCTION 挪到 類別庫中去使用

       有哪些注意的事項

     

    整理一下寫成共用類別,然後使用 Shared 來標註為靜態函式 (Public Shared Function xxx ....),再加到類別庫中,這樣可以在不產生物件實體情況下直接呼叫,但若是函數需要物件資料時,就要考慮實作成類別物件。

     

    4.最後來有一個 問題就是 像是MSCOMM / WINSOCK 有辦法在類別庫中使用??

      (我有一些通訊的 函式 也是一直在重複)

     

    是可以引用,但在 .NET Framework,請考慮改用 System.IO.Ports.SerialPort 來取代 MSCOMM,以及用 System.Net.Sockets.TcpClient 或是 Socket 類別來取代 WINSOCK 元件,一來不必再經過一道向下相容的轉換程序,二來速度也會快多了。

    2008年5月5日 上午 03:08
    版主
  • HI,

     

    您DLL是VB.NET做的, 然後要拿給VB6的程式用嗎? 如果是拿給VB.NET程式用, 就將做好的的DLL拿給程式參考, 然後加好Namespace, 就可以直接利用類別名稱和Function名稱來用, 如果要給VB6的程式用, 可以先看一下以下的文件:

     

    http://www.15seconds.com/issue/040721.htm

     

    tihs

    2008年5月5日 上午 03:27
  • 很久之前我寫的一份是外掛而已

    VB.NET編成 *.DLL  後來,用VB6 或VBScript 可以呼叫 VB.NET 的 *.DLL 檔

    給你參考研究

     

    Code Snippet

    Imports System.EnterpriseServices
    Imports System.Reflection
    '********************************************
    '還別進入 Visual Basic 2005 或 Visual C# 啟動程式
    '先進入 [ 命令提示字元 ]
    'DOS > sn -k TGCore.snk 產生金鑰
    '後來進入 Visual Basic 2005 或 Visual C# 啟動程式
    '新的檔案 Class1.vb 類別庫
    '方案總管 > Class1.vb > 選檔滑鼠右鍵 > 屬性 > 檔名 > 改名TGCore.vb
    '加入參考 System.EnterpriseServices
    '把我寫的文件拷貝貼上去 TGCore.vb 資料
    '功能表 [ 專案 ] TGCore 屬性 > 應用程式 > 組件資訊 > [ 打勾 ] 讓組件成為 COM-Visible
    '功能表 [ 建置 ] 產生 TGCore.DLL
    '檢查目錄裡 C:\Documents and Settings\User\My Documents\Visual Studio 2005\Projects\TGCore\bin\Release\TGCore.DLL 在不在檔案,我的目錄和你不同目錄
    '先進入 [ 命令提示字元 ]
    'DOS > regsvcs TGCore.DLL 加入註冊
    'DOS > regsvcs -u TGCore.DLL 解除註冊
    '注意:註冊後再次 VB6 執行呼叫DLL,解除註冊 VB6 不能呼叫DLL懂了嗎?
    '********************************************
    <Assembly: ApplicationAccessControl(False)>  '應用進入管理 [ 不真實False ]
    <Assembly: AssemblyKeyFile("C:\TGCore.snk")>   '金鑰檔案的目錄
    '********************************************
    Public Class MyLib
        Inherits ServicedComponent

        Private Declare Function GetDC Lib "user32" (ByVal hwnd As Int32) As Int32
        Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Int32, ByVal hdc As Int32) As Int32
        Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
        Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Int32, ByVal dx As Int32, ByVal dy As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As Int32)
        Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
        Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Int32, ByVal wMapType As Int32) As Int32
        Private Declare Function GetMessageExtraInfo Lib "user32" () As Int32

        Public Function GetColor(ByVal x As Int16, ByVal y As Int16) As Int32
            Dim Color As Int32 = GetPixel(GetDC(0), x, y)
            ReleaseDC(0, GetDC(0))
            Return Color
        End Function
        Public Sub MouseMove(ByVal x As Int16, ByVal y As Int16, ByVal Width As Int16, ByVal Height As Int16)
            mouse_event(32769, CInt(65535 / Width) * x, CInt(65535 / Height) * y, 0, GetMessageExtraInfo())
        End Sub
        Public Sub MouseMsg(ByVal Msg As Byte)
            mouse_event(Msg, 0, 0, 0, GetMessageExtraInfo())
        End Sub
        Public Sub KeybdMsg(ByVal bVk As Byte, ByVal Msg As Byte)
            keybd_event(bVk, MapVirtualKey(bVk, 0), Msg, GetMessageExtraInfo())
        End Sub

     

        'VB6 寫法
        '
        'Dim obj , cr
        'Set obj = CreateObject("TGCore.MyLib")
        'cr = obj.GetColor( 10 , 10 )

    End Class

     

     

    2008年5月5日 上午 10:06

所有回覆

  • Hi,

    想先確定一下,你的DLL是用什麼去做的呢?.Net還是..? 進入點可以用depends這個工具協助去看,但一般的.Net DLL用加入參考的,加入完之後就可以利用裡面的功能了。

    2008年5月5日 上午 01:55
    版主
  • HI,

     

    您可以做一個類別庫專案, 為專案加入類別, 再將Function寫在類別中, 記得將Function標示為Shared, 表示要使用類別名稱來呼叫, 例如:

     

    結果=類別名稱.Function名稱(參數)

     

    原則上類別庫專案可以使用Winsock控制項, 萬一無法使用, 可以先於類別庫中加入Form, 再於Form上貼Winsock控制項, 要用的時候, 先建立Form物件, 再使用其上的Winsock控制項

     

    tihs

    2008年5月5日 上午 02:23
  • bauann大大

    DLL 我是用vb.net 寫的

    以下是我的FUNCTION


    Function ModBus_CRC(crcVar&, bytData As Byte) As Long
    Dim I As Byte, Carry As Boolean
    Const cntPoly = 40961  '2 ^ 15 + 2 ^ 13 + 1

    crcVar& = crcVar& Xor bytData
        For I = 1 To 8
            Carry = crcVar& Mod 2 > 0
            crcVar& = Int(crcVar& / 2)
            If Carry Then
                crcVar& = crcVar& Xor cntPoly
            End If
        Next
        ModBus_CRC = crcVar&
    End Function


    Function ModBus_GetCRC(InputString As Variant) As String
    Dim crcVar&, Index As Integer, bytData As Byte
    Dim Temp$
    crcVar& = 2 ^ 16 - 1
       
        For Index = 1 To Len(InputString) Step 2
            bytData = Val("&H" + Mid(InputString, Index, 2) + "&")
            crcVar& = ModBus_CRC(crcVar&, bytData)
        Next

        Temp = Right("0000" + Hex(crcVar), 4)
        ModBus_GetCRC = Right(Temp, 2) + Left(Temp, 2)
       
    End Function

     

    我是希望做成DLL之後

    可以直接在 Module 中 宣告

    Private Declare Sub GETCRC Lib "XXXX.dll" (ByVal GetStr as String)

     

    然後 我就可以在 程式中 直接 AAA = GETCRC ("字串")

     

     

     

    tihs 大大

    因為 我們公司都還沒有轉型 有關於.net的這部份 不是很了解

    有關於你給我的建議

    我會去 試看看

    不過小弟我 用的不熟

    所以 真的是有給它看 沒有給他懂

     

    不知道 大大 有沒有 關於這部份的好書 可以介紹一下

    謝謝了

     

    埋頭苦幹 測試中><"

    2008年5月5日 上午 02:38
  • 你引用的方法錯誤。

    VB.NET 產出的是 .NET DLL,只要加入該類別庫的參考即可使用。

    而你用的是呼叫 Win32 這種純 DLL 的方法,當然無法成功。

     

    1.不知道哪裡有開發DLL類別庫的範例(只要簡單的就可以了 我的FUNCTION都是一些簡單的計算 但是要回傳值)

     

    你只要知道基本的類別結構,要寫類別庫基本上不需要範例 ...

     

    2.小地想要學開發DLL 各位大大有沒有推薦的好書。

     

    這和 1 一樣,但如果你要學習元件開發,就有幾本書可以參考,建議你去天瓏走一趟自己看內容,看的下再買:

     

    Code Snippet

    1. ASP.NET 元件設計(碁峰,黃忠成著)

    2. MCTS Training Kit for 70-526 (MS Press)

    3. OOP for VB.NET and C# (MS Press, 有中文書)

     

     

    3.各位大大可以簡單跟我說明一下,我將這些已使用很久的FUNCTION 挪到 類別庫中去使用

       有哪些注意的事項

     

    整理一下寫成共用類別,然後使用 Shared 來標註為靜態函式 (Public Shared Function xxx ....),再加到類別庫中,這樣可以在不產生物件實體情況下直接呼叫,但若是函數需要物件資料時,就要考慮實作成類別物件。

     

    4.最後來有一個 問題就是 像是MSCOMM / WINSOCK 有辦法在類別庫中使用??

      (我有一些通訊的 函式 也是一直在重複)

     

    是可以引用,但在 .NET Framework,請考慮改用 System.IO.Ports.SerialPort 來取代 MSCOMM,以及用 System.Net.Sockets.TcpClient 或是 Socket 類別來取代 WINSOCK 元件,一來不必再經過一道向下相容的轉換程序,二來速度也會快多了。

    2008年5月5日 上午 03:08
    版主
  • HI,

     

    您DLL是VB.NET做的, 然後要拿給VB6的程式用嗎? 如果是拿給VB.NET程式用, 就將做好的的DLL拿給程式參考, 然後加好Namespace, 就可以直接利用類別名稱和Function名稱來用, 如果要給VB6的程式用, 可以先看一下以下的文件:

     

    http://www.15seconds.com/issue/040721.htm

     

    tihs

    2008年5月5日 上午 03:27
  • 謝謝小朱 大大 您 講解的這麼詳細^^

    那 現在我又有一些問題在請問一下

     

    VB.NET 產出的是 .NET DLL,只要加入該類別庫的參考即可使用。

    我在VB6中 可以加入参考嗎?要怎麼加入参考?

     

    所謂的 純DLL 和 .net DLL 有哪些差別?

    那要開發出 純DLL 的話有可能嗎?

     

    我有去 找一些資料 不過 "GOOGLE大神" 這部份的資料 很多也很雜

    可能是我的關鍵字 也設定的不好

    不知道 小朱大大 是否有 比較 精闢的文章 可以讓我參考一下

     

     

    '_________________________________________________

    tihs 大大

     

    謝謝您唷

    目前在實測 您的部份

    看起來 要拿給vb6用 還真的不簡單><"

    如果 在有其他問題 在上來 提問

     

    再麻煩 兩位大大 不另指教 感恩唷^^

     

     

    2008年5月5日 上午 06:06
  • 要把 .NET DLL 開放給 COM Client (VB6) 使用,必須要經過 regasm.exe 這個程序,可參考 tihs 大的說明。

     

    純 DLL 是指使用 C 的 export 功能匯出函式符號表 (symbol table) 的 DLL,以 Windows 現有的 User32.DLL,Kernel32.DLL,GDI32.DLL 或是 Advapi32.DLL 這些,若硬體廠商有提供 DLL,也大多是這種類型。純 DLL 必須要由 C/C++ 來開發。

     

    .NET DLL 和 COM DLL (VB6 可產出的 DLL) 雖然都是用加入參考的方式,但底層大不同。COM DLL 是以 COM 平台為主,而且有實作 IDispose 介面的 DLL,擁有型別函式庫來識別,而 .NET DLL 是以組件的方式存在於 .NET Framework 平台上,COM 和 .NET 可以互通。

     

     

    2008年5月5日 上午 06:57
    版主
  • 先搜尋 DLL 類型
    http://forums.microsoft.com/MSDN-CHT/Search/Search.aspx?words=DLL+%E9%A1%9E%E5%9E%8B&searchKey=&lcid=1028&searchscope=forumscope&siteid=14&ForumID=232&ForumGroupID=-1

     

    比如說:

    回覆:如何使用原本可在VB6 中使用的*.DLL檔
    http://forums.microsoft.com/msdn-cht/ShowPost.aspx?PostID=332328&SiteID=14

     

    本版公告中 關於VB2005資源分享 裡面這一個回應有一系列的微軟範例:

    將 .Net 類別公開給 VB6 使用:

     

    VB6 可藉由編譯中斷法來取得 obj 檔,再產生純函數的 dll ,但是因為編譯模型並不支援多緒,此 dll 並不建議使用。

    2008年5月5日 上午 07:07
    版主
  • 很久之前我寫的一份是外掛而已

    VB.NET編成 *.DLL  後來,用VB6 或VBScript 可以呼叫 VB.NET 的 *.DLL 檔

    給你參考研究

     

    Code Snippet

    Imports System.EnterpriseServices
    Imports System.Reflection
    '********************************************
    '還別進入 Visual Basic 2005 或 Visual C# 啟動程式
    '先進入 [ 命令提示字元 ]
    'DOS > sn -k TGCore.snk 產生金鑰
    '後來進入 Visual Basic 2005 或 Visual C# 啟動程式
    '新的檔案 Class1.vb 類別庫
    '方案總管 > Class1.vb > 選檔滑鼠右鍵 > 屬性 > 檔名 > 改名TGCore.vb
    '加入參考 System.EnterpriseServices
    '把我寫的文件拷貝貼上去 TGCore.vb 資料
    '功能表 [ 專案 ] TGCore 屬性 > 應用程式 > 組件資訊 > [ 打勾 ] 讓組件成為 COM-Visible
    '功能表 [ 建置 ] 產生 TGCore.DLL
    '檢查目錄裡 C:\Documents and Settings\User\My Documents\Visual Studio 2005\Projects\TGCore\bin\Release\TGCore.DLL 在不在檔案,我的目錄和你不同目錄
    '先進入 [ 命令提示字元 ]
    'DOS > regsvcs TGCore.DLL 加入註冊
    'DOS > regsvcs -u TGCore.DLL 解除註冊
    '注意:註冊後再次 VB6 執行呼叫DLL,解除註冊 VB6 不能呼叫DLL懂了嗎?
    '********************************************
    <Assembly: ApplicationAccessControl(False)>  '應用進入管理 [ 不真實False ]
    <Assembly: AssemblyKeyFile("C:\TGCore.snk")>   '金鑰檔案的目錄
    '********************************************
    Public Class MyLib
        Inherits ServicedComponent

        Private Declare Function GetDC Lib "user32" (ByVal hwnd As Int32) As Int32
        Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Int32, ByVal hdc As Int32) As Int32
        Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
        Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Int32, ByVal dx As Int32, ByVal dy As Int32, ByVal cButtons As Int32, ByVal dwExtraInfo As Int32)
        Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Int32, ByVal dwExtraInfo As Int32)
        Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Int32, ByVal wMapType As Int32) As Int32
        Private Declare Function GetMessageExtraInfo Lib "user32" () As Int32

        Public Function GetColor(ByVal x As Int16, ByVal y As Int16) As Int32
            Dim Color As Int32 = GetPixel(GetDC(0), x, y)
            ReleaseDC(0, GetDC(0))
            Return Color
        End Function
        Public Sub MouseMove(ByVal x As Int16, ByVal y As Int16, ByVal Width As Int16, ByVal Height As Int16)
            mouse_event(32769, CInt(65535 / Width) * x, CInt(65535 / Height) * y, 0, GetMessageExtraInfo())
        End Sub
        Public Sub MouseMsg(ByVal Msg As Byte)
            mouse_event(Msg, 0, 0, 0, GetMessageExtraInfo())
        End Sub
        Public Sub KeybdMsg(ByVal bVk As Byte, ByVal Msg As Byte)
            keybd_event(bVk, MapVirtualKey(bVk, 0), Msg, GetMessageExtraInfo())
        End Sub

     

        'VB6 寫法
        '
        'Dim obj , cr
        'Set obj = CreateObject("TGCore.MyLib")
        'cr = obj.GetColor( 10 , 10 )

    End Class

     

     

    2008年5月5日 上午 10:06
  • 不必做到這麼複雜吧 ...

    這個範例是 COM+ DLL,一般的 DLL 不必用到 COM+ ...

    2008年5月5日 下午 01:44
    版主
  • 謝謝 樓上 幾位大大^^

     

    小弟我現在也在實測

     

    昨天下午跑去買書><'

     

    缺貨

     

    過幾天在去台北 買看看

     

    謝謝各位大大了

     

    繼續埋頭苦幹

     

    橘子誘惑  大大

     

    依照 妳的方法 實際做出DLL 檔後

     

    在VB6中

     

    執行的時候 會出執行階段錯誤 429

     

    AcvtinX 元件無法產生物件??

     

    再麻煩大大  一下^^

     

    感恩

    2008年5月6日 上午 03:32
  • Set obj = CreateObject("組件名稱.MyLib")

    調用什麼("組件名稱")

    2008年5月6日 上午 09:36
  • 再次感謝個位大大唷

     

    這次學到蠻多東西的^^

     

    不過 這樣的DLL 不符合 我們家老闆的 需求><"

     

    後來我有再爬到一篇文章

     

    http://www.windowsdevcenter.com/pub/a/windows/2005/04/26/create_dll.html?page=1

     

     

    裡面有介紹 VB6如何開發成函數型的DLL

     

    但是 裡面的

    The ActiveX DLL Project Type

    的下面 後面開始的作法

     

    弄了許久 還是弄不出來

     

    不知道各位大大

     

    對這個還有其他見解嗎??

     

    提供一下 給小弟我参考

    2008年5月7日 上午 05:34
  •  

    不過 我已經跟我們家老大 溝通過了

     

    目前 先以

     

    CREATE 方式  的ActiveX dll

     

    為主

     

    先求VB6能用

     

    在求大家都能用

     

    再次感謝大家唷

     

     

    2008年5月7日 上午 06:37