【发布时间】:2015-07-29 15:44:13
【问题描述】:
我是电气工程师出身,所以我对C#,DLL等的知识很少。我想将c函数用于C#。我知道有几篇关于此的帖子,但我没有找到足够简单的帖子。
目前,我得到了 C 函数调用 windows API 以在 USB 端口上读/写。首先创建一个 .dll 我需要一个头文件吗?因为我将以下函数声明函数放入了标题中。我在堆栈溢出和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# 项目中引用头文件时。我仍然收到无法引用该文件的消息。
【问题讨论】:
-
抱歉帮不了你。我建议您查看一些代码项目文章,例如 codeproject.com/Articles/9826/…
-
您不能添加非托管 dll 作为参考。您需要为每个函数编写 p/invoke 导入。或者更好的是,创建一个 C++/CLI 包装器。