c# - 从 C# 调用 C

标签 c# c++ c dll dllimport

我来自电气工程师背景,因此我对 C#、DLL 等知之甚少……我想将 c 函数用于 C#。我知道有几篇关于此的文章,但我没有找到足够简单的文章。

目前,我使用 C 函数调用 Windows API 来读取/写入 USB 端口。首先要创建一个 .dll,我需要一个头文件吗?因为我将以下函数 decleration 函数放入 header 中。我在stack overflow和网上看到的例子只用了一个简单的.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# 项目中引用头文件时。我仍然收到无法引用该文件的消息。

最佳答案

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

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

关于c# - 从 C# 调用 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31705171/

相关文章:

c++ - 有数据的空闲缓冲区

c - 帮助编译器优化函数指针

c# - Google Freebase Api C# .Net 示例

c# - WebService 不反序列化某些对象

c++ - 嵌套的基于范围的 for 语句是否严格合法?

检查 C 中的特殊字符

更改 simpleVRML 文件名错误

c# - SPItemEventReceiver 类中的确认框

c# - 如何在 StyleCop 设置和并发性中的单个 "Custom Rules"节点下组合多个自定义 StyleCop 规则

c++ - QTreeView 禁止显示根节点