在C#中调用c dll

Gio*_*der 6 c c# c++ dllimport dllexport

问题简介:

我必须通过提供DLL文件,LIB文件和c函数头文件的API来控制某个设备,其函数被声明为dllimport.

当我在C++项目中使用API​​时,一切正常 - 我包含头文件,lib,dll,并调用头文件中声明的函数.

当尝试使用[DllImport]属性从C#.NET项目调用这些函数时,问题就出现了:使用确切的名称和参数声明函数,并且运行代码不会抛出任何异常.然而,设备根本没有响应,就像从未实际调用过的函数一样.

它是如何在C头中声明的:

int __declspec(dllimport) Init_Card_RTx(unsigned short device_num, unsigned short enabled_channels, unsigned short xmt_channels);
Run Code Online (Sandbox Code Playgroud)

它是如何在C#中声明的:

[DllImport(Path, CallingConvention = CallingConvention.Cdecl, EntryPoint = "Init_Card_RTx")]
public static extern int Init_Card_RTx(UInt16 device_num, UInt16 enabled_channels, UInt16 xmt_channels);
Run Code Online (Sandbox Code Playgroud)

问题:

  • 那是因为标题中的函数被声明为dllimport吗?
  • 在这种情况下,我是否必须使用声明为dllexport的C++函数包装DLL?
  • 可以从C#访问C DLL所需的步骤是什么?
  • 在C#项目中,我是否还必须包含LIB文件?不只是DLL文件本身?

Xav*_*r J 0

这种事情总是让人头疼。您必须确保传递的数据的字节结构与您的 DLL 所期望的完全匹配。C# 中的本机结构不知道它们是从外部传递的,因此您必须更严格地构造代码。

请参阅此处了解更多信息:

http://msdn.microsoft.com/en-us/library/awbckfbz(v=vs.110).aspx