我来自电气工程师背景,因此我的知识很少关于C#,DLL等....我想将c函数用于C#。我知道有一些关于此的帖子,但我找不到一个足够简单的帖子。
目前,我在USB端口上有C函数调用windows API来读/写。首先创建.dll我需要头文件吗?因为我将以下函数decleration函数放入标题中。我在堆栈溢出和Internet上看到的示例只使用一个简单的.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.
[编辑]
我尝试了以下solution,但是当我尝试在c#项目中引用头文件时。我仍然收到无法引用该文件的消息。
答案 0 :(得分:0)
您不需要头文件,但每个函数都需要__declspec(dllexport)。如果它是C ++(即.cpp文件),那么你需要extern" C"。
有一个名为depends.exe的方便程序,它允许您查看DLL并查看它导出的函数以及它是否依赖于任何其他DLL。这可能就是你的DllImport失败的原因。