我必须与在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,就可以在intellisense窗口弹出“添加”功能。
可能因为在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类库中调用这些函数的正确方法,请告诉我,我是新手。另外,如果我的某些术语不正确,请原谅我;我不熟悉编程术语(还)。
答案 0 :(得分:0)
intellisense在您的两个场景中有所不同,因为非托管DLL缺少正确显示有关函数的信息所需的元数据。您的VB函数 拥有该元数据。
你已经知道了解决方法;手动键入库和类名。或者,您可以将非托管函数包装在托管VB方法中,这将为智能感知提供所需的元数据。
答案 1 :(得分:0)
请参阅Declare statement上的MSDN文档。这类似于在C#中声明extern
方法。我认为你缺少的是访问修饰符。它应该像Public Declare ...
一样允许它在声明它之外的地方使用。
如果这不是问题,您可能希望使用Public Shared Function
在公共类中将其声明为DllImport
。其中的一个示例显示在Declare statement doc的底部。
对于这一点,以及一般的C#/ VB转换,在ILSpy中反编译您的程序集并查看由于这些行生成的内容也很有用。