0

我需要在 c# 2010 上使用最旧的 .dll 驱动程序(.dll 不是 .net)。我有一个关于 .dll 的快速文档,其中显示了 initdriver、closedriver、readdata ad 等等。

例如 INITDRIVER:

UNITE_RC rc = InitDriver(USHORT usNB_drv);
Parameters: usNB_drv: number or istance of driver that will be open
Return information:
OK:  well done
EBORNES: usNB_drv must be 1 or 2
EDRVAOPEN: driver yet open

所以我尝试在网络上找到一个解决方案,我认为我必须使用 DLLImport,因为我无法使用引用或 COM+ 在我的项目中链接 dll。有人可以帮我提供一些样品吗?十分感谢

4

1 回答 1

2

好吧,我们不知道UNITE_RC扩展为什么。我将假设它扩展为int. 在这种情况下,您的 p/invoke 声明将是:

[DllImport(@"MyLib.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int InitDriver(ushort usNB_drv);

我还假设调用约定是cdecl因为您提供的代码没有另外说明。当然,可以想象实际代码,可能在UNITE_RC宏中,可能在其他地方,指定了不同的调用约定。要深入了解这一点,您确实需要使用随库提供的 C++ 头文件。

解决该问题的另一种方法是在库周围使用混合模式 C++/CLI 包装器。这将允许您通过包含头文件的标准 C++ 机制调用并链接到本机代码,并向链接器提供导入库 (.lib)。然后,您可以导出一个托管类(C++/CLI 中的引用类)供您的 C# 代码使用。如果本机代码有多个您需要调用的函数,这是将其公开给 C# 代码的最不容易出错的方法。

于 2013-10-10T16:25:43.500 回答