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#项目中引用头文件时。我仍然得到不能引用文件的消息

Calling C from C#

您不需要头文件,但您需要__declspec(dllexport)每个函数。如果它是c++(即。cpp文件),你需要extern "C"。

有一个方便的程序叫做depends.exe,它允许你查看一个DLL,看看它导出了什么函数,以及它是否依赖于任何其他DLL。这可能就是你的DllImport失败的原因。