簡體   English   中英

使用C#正確公開VB類庫中的函數

[英]Properly exposing functions in VB class library using c#

我必須與在C#中使用非托管DLL的控制器進行通信。 該文檔對DLL並不是很有幫助,我沒有與DLL交談的經驗。 該公司確實為示例VB項目提供了一個類,該類包裝了VB中的DLL。 該類稱為ctccom32v2。

我以為,由於調用非托管DLL的繁瑣工作已經完成,包括結構和其他變量,因此我可以使用該類來創建VB類庫。 我認為這將節省很多時間和精力。 因此,我將該類源文件添加到VB類庫項目中,並且在構建時吐出了一個dll。 然后,我將該dll添加到我的C#項目引用中,並且能夠在引用瀏覽器中看到這些功能。 我創建的庫名為CTC_Lib。

(如果您想知道為什么我不使用VB編寫程序而不使用它們的類,我更喜歡並且我更願意使用C#進行工作)

我遇到的問題是:如果我使用創建庫的實例

CTC_Lib.Ctccom32v2 ctc = new CTC_Lib.Ctccom32v2();

然后嘗試鍵入ctc.somefunction,intellisense顯示了一些默認方法,例如Equals,GetHashCode等。我看不到任何暴露非托管DLL的Ctccom32v2函數。

如果我像這樣手動輸入庫和類名:

CTC_Lib.Ctccom32v2.

智能感知列表將彈出Ctccom32v2中的所有功能。

如果我將另一個類添加到VB類庫中(我們稱其為“ somelib”),然后在其中添加一個簡單的函數:

Public Function add() as Void
Return 1+2;
End Function

然后,我使用相同的方法創建實例:

CTC_Lib.somelib ctc = new CTC_Lib.somelib();

現在,只需鍵入ctc,即可在智能感知窗口中彈出“添加”功能。

可能是因為在VB類中聲明了函數的方式嗎? 這是VB類中的許多函數之一,使用“聲明自動函數”將它們全部聲明為相同:

Declare Auto Function CtOpenConnection Lib "Ctccom32v2.dll" _
    (ByVal ConnectID As Integer, ByVal CommPort As Integer, ByVal Address As Integer) As Integer

我不知道Auto函數的含義,但是當您嘗試創建其所駐留的類的實例時,該函數不會公開。

如果這不是在VB類庫中調用這些函數的正確方法,請告訴我,我是新手。 另外,如果我的某些術語不正確,請原諒我。 我對編程術語還不滿意(尚未)。

在兩種情況下,智能感知有所不同,因為非托管DLL缺少正確顯示有關功能的信息所需的元數據。 您的VB函數確實擁有該元數據。

您已經知道解決方法; 手動輸入庫和類名。 另外,您可以將非托管函數包裝在托管VB方法中,這將提供用於智能感知的所需元數據。

請參閱有關Declare語句的MSDN文檔。 這看起來類似於在C#中聲明extern方法。 我認為您缺少的是訪問修飾符。 它應該像“ Public Declare ...允許在聲明的地方之外使用。

如果這不是問題,則可能需要使用DllImport將其聲明為公共類中的Public Shared Function Declare語句doc的底部顯示了一個示例。

也許對此有用,並且對於一般的C#/ VB轉換,在ILSpy中反匯編程序集並查看由於這些行而生成的內容也很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM