0

我必须与在 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 类库中调用这些函数的正确方法,请告诉我,我是新手。另外,如果我的某些术语不正确,请原谅我;我不擅长编程术语(还)。

4

2 回答 2

1

两种情况下的智能感知不同,因为非托管 DLL 缺少正确显示函数信息所需的元数据。您的 VB 函数确实拥有该元数据。

您已经知道解决方法;手动输入库和类名。或者,您可以将非托管函数包装在托管 VB 方法中,这将为智能感知提供所需的元数据。

于 2012-06-28T16:50:06.910 回答
0

请参阅有关Declare 语句的 MSDN 文档。这看起来类似于extern在 C# 中声明一个方法。我认为您缺少的是访问修饰符。它应该Public Declare ...允许它在声明的地方之外使用。

如果这不是问题,您可能希望Public Shared Function在公共类中将其声明为 a ,使用DllImport. Declare statement doc的底部显示了一个示例。

在ILSpy中反编译您的程序集并查看由于这些行而生成的内容,也可能是有用的,也许对于这个和一般的 C#/VB 转换。

于 2012-06-28T16:50:46.210 回答