【问题标题】:Calling C from C#从 C# 调用 C
【发布时间】: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 包装器。

标签: c# c++ c dll dllimport


【解决方案1】:

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

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

【讨论】:

  • 没有。用户正在尝试添加不适合非托管 dll 的引用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多