我必须与在 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”声明为相同的:
Declare Auto Function CtOpenConnection Lib "Ctccom32v2.dll" _
(ByVal ConnectID As Integer, ByVal CommPort As Integer, ByVal Address As Integer) As Integer
我不知道 Auto 函数的含义,但是当您尝试创建它所在的类的实例时,它不会公开该函数。
如果这是或不是在 VB 类库中调用这些函数的正确方法,请告诉我,我是新手。另外,如果我的某些术语不正确,请原谅我;我不擅长编程术语(还)。