我需要在c#2010上使用最旧的.dll驱动程序(.dll不是.net)。我有一个关于.dll的快速文档,它向我展示了initdriver,closedriver,readdata等等。
对于istance 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。有人可以帮我一些样品吗?非常感谢你
答案 0 :(得分: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中的ref类)以供您使用的C#代码。如果本机代码有多个需要调用的函数,这是将它暴露给C#代码的最不容易出错的方法。