从C#调用C#

时间:2015-07-29 15:44:14

标签: c# c++ c dll dllimport

我来自电气工程师背景,因此我的知识很少关于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#项目中引用头文件时。我仍然收到无法引用该文件的消息。

1 个答案:

答案 0 :(得分:0)

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

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