Calling C from C#
本文关键字:from Calling | 更新日期: 2023-09-27 18:05:18
我来自电气工程师背景,因此我对c#,DLL等知识很少....我想用c函数变成一个c#。我知道有一些帖子是关于这个的,但是我没有找到一个足够简单的。
目前,我得到C函数调用windows API在USB端口上读/写。首先创建一个。dll,我需要一个头文件吗?因为我把下面的函数声明成一个头函数。我在堆栈溢出和互联网上看到的例子只使用一个简单的。c文件,我可以摆脱头文件吗?
__declspec(dllexport) LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
BOOL *pbDriverInstalled);
__declspec(dllexport) LMUSB_HANDLE __stdcall InitializeDeviceByIndex(unsigned short usVID,
unsigned short usPID,
LPGUID lpGUID,
DWORD dwIndex,
BOOL bOpenDataEndpoints,
BOOL *pbDriverInstalled);
__declspec(dllexport) BOOL __stdcall TerminateDevice(LMUSB_HANDLE hHandle);
__declspec(dllexport) BOOL __stdcall WriteUSBPacket(LMUSB_HANDLE hHandle,
unsigned char *pcBuffer,
unsigned long ulSize,
unsigned long *pulWritten);
__declspec(dllexport) DWORD __stdcall ReadUSBPacket(LMUSB_HANDLE hHandle,
unsigned char *pcBuffer,
unsigned long ulSize,
unsigned long *pulRead,
unsigned long ulTimeoutMs,
HANDLE hBreak);
__declspec(dllexport) BOOL __stdcall Endpoint0Transfer(LMUSB_HANDLE hHandle, UCHAR ucRequestType,
UCHAR ucRequest, USHORT usValue,
USHORT usIndex, USHORT usLength,
PUCHAR pucBuffer, PUSHORT pusCount);
第二点,我需要在cpp文件中写__declspec(dllexport)吗?下面是cpp中的一个函数:
extern "C" __declspec(dllexport) BOOL PASCAL EXPORT TerminateDevice(LMUSB_HANDLE hUSB)
我不知道"BOOL PASCAL EXPORT"是做什么的,这段代码是从一个家具项目中回收的。
最后,当正确构建DLL时。我如何在c#项目中导入它?我尝试了以下操作,但没有成功:
[DllImport("lmusbdll.dll")]
我看到你可以使用右键单击项目并添加引用,但是Visual Studio弹出一个错误消息:
A reference to "DLL path" could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.
[编辑]我尝试了以下解决方案,但是当我试图在c#项目中引用头文件时。我仍然得到不能引用文件的消息
您不需要头文件,但您需要__declspec(dllexport)每个函数。如果它是c++(即。cpp文件),你需要extern "C"。
有一个方便的程序叫做depends.exe,它允许你查看一个DLL,看看它导出了什么函数,以及它是否依赖于任何其他DLL。这可能就是你的DllImport失败的原因。